2010-07-29 144 views
9

我有一个实体框架模型(v.1.0),我试图扩展一个计算属性。实体框架计算属性问题

我创建了部分类以这种方式扩大实体对象“要约”:

namespace MyModelNamespace 
{ 
    public partial class Offer 
    { 
     public bool MyProperty 
     { 
      get 
      { 
       // my stuffs the return true or false 
      } 
     } 
    } 
} 

它编译没有在我的装配问题,但在运行时,当我试图做一些事情像这样:

_myEntities.OfferSet.FirstOrDefault(o=>o.MyProperty); 

我找回这个错误:

The number of members in the conceptual type 'MyModelNamespace.Offer' does not match with the number of members on the object side type 'MyModelNamespace.Offer'. Make sure the number of members are the same.

...任何建议???

回答

5

是的,你可以这样做。使用LINQ translations library

+0

有趣...我会尽快尝试! – tanathos 2010-07-29 23:27:39

+2

我正在尝试它,但我无法得到它的工作:(......我已经包括了DLL,它编译得很好,但在运行时我得到像这样:“指定的成员'MyProperty'不支持LINQ to Entities“我完全按照你发布的链接中的例子 – tanathos 2010-07-30 08:10:15

+0

@tanathos你的问题可能与静态初始化有关。请参阅Matyas Boros在8月30日关于该文章的评论。建议的解决方法是在类上创建一个(空)静态构造函数,然后在查询对象之前有时实例化该对象的一个​​实例。丑陋:( – AaronSieb 2011-01-12 22:28:37

1

您无法将自定义属性推送到数据库。你应该得到像

"The specified type member 'MyProperty' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

做你想做的是唯一有效的方法是把它存入内存。然后过滤。

_myEntities.OfferSet.ToList().FirstOrDefault(o=>o.MyProperty); 

我猜测可能有更好的方法来完成您正在做的任何事情。

编辑 我同意克雷格有另一种方式,假设*它可以被翻译成商店的表达式。如果您将属性映射到某种类型的查询,您将能够搜索/按下过滤器。

+0

不是唯一的方法;看到我的答案。 – 2010-07-29 20:43:08

+0

你是对的,我假设他试图使用某种类型的常量或派生属性。 – Nix 2010-07-29 22:24:10

+0

在这种情况下,AsEnumerable()比ToList()更好。 – 2010-07-30 15:37:21

0

您可以尝试的一种方法是使用System.Linq.Expressions命名空间和可用的可扩展扩展方法here

我在想你可以传递一个表达式到FirstOrDefault方法,如果你还想在其他地方使用MyProperty,你可以使用相同的表达式来计算它的值。所以,你必须是这样的:

public partial class Offer 
{ 
    public static Expression<Func<Offer, bool>> exp 
    { 
     get 
     { 
      return o => o.Property1 * o.Property2 == someValue; 
     } 
    } 

    public bool MyProperty 
    { 
     get 
     { 
      return exp.Compile()(this); 
     } 
    } 
} 

再后来,你通过它在:

_myEntities.OfferSet.AsExpandable().FirstOrDefault(Offer.exp.Compile())); 

如果你的计算可以被转换成SQL理解表达式树,我认为这会工作。它与非实体测试类一起工作,但将其与LINQ to Entities一起使用是不同的动物。

我没有使用过多的AsExpandable,所以这段代码可能不对。我愿意改正。

+0

'MyFunc'需要成为'Expression 2010-07-29 23:39:04

+0

好点。这意味着lambda需要是一个表达式的声明块,所以我希望可以用这种方式表达计算结果。 – 2010-07-30 15:37:04