我有一个实体框架模型(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'。确保 成员数量相同。
...任何建议???
答案 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,所以这段代码可能不对。我愿意接受更正。