实体框架计算属性问题

时间:2010-07-29 14:16:33

标签: c# entity-framework linq-to-entities

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

我已经创建了部分类来以这种方式扩展实体对象“Offer”:

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

它在我的程序集中编译没有问题,但在运行时,当我尝试做这样的事情时:

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

我检索到这个错误:

  

中的成员数量   概念类型'MyModelNamespace.Offer'不匹配   与成员的数量   对象端类型'MyModelNamespace.Offer'。确保   成员数量相同。

...任何建议???

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

这样的东西
  

“LINQ to Entities不支持指定的类型成员'MyProperty'。仅支持初始值设定项,实体成员和实体导航属性。”

执行所需操作的唯一有效方法是将其放入内存中。然后过滤。

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

我猜你可能有更好的方法来完成你正在做的事情。

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

答案 2 :(得分:0)

您可以尝试的一种方法是使用System.Linq.Expressions命名空间和可用的AsExpandable扩展方法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,所以这段代码可能不对。我愿意接受更正。