我使用Entity Framework 4.3
我写扩展方法:
public static IQueryable<TSource> Active<TSource>(this IQueryable<TSource> source) where TSource : class, IStatusable
{
return source.Where(s => s.Status == (int)StatusEnum.Enabled);
}
这很好用:
var cat=Context.Categories.Active().ToList()
但是我需要在Select中使用这个扩展方法。 看简化查询:
return Context.Categories
.Select(c => new { Children=c.Children.AsQueryable().Active()})
.ToList()
(儿童 - 儿童类别的收集) 当查询执行时,我收到一条错误消息:
LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[Portal.FrontOffice.Model.Category] Active[Category](System.Linq.IQueryable`1[Portal.FrontOffice.Model.Category])' method, and this method cannot be translated into a store expression.
为什么不起作用?怎么写得正确?
答案 0 :(得分:2)
正如我的评论中所述,每次出现此错误消息时出现同样的原因:
EF提供程序用于创建SQL的表达式树包含一个它不理解的方法
在您的情况下,这是Active
扩展方法。它是表达式树的一部分,因为它在另一个表达式(Select
)中使用。
在第一个查询中,您的方法是 NOT 表达式树的一部分。相反,只需通过向其添加Where
表达式,更改表达式树。这是一个根本区别。
要使您的第二个查询有效,请使用以下命令:
return Context.Categories
.Select(c => new { Children=c.Children
.Where(s => s.Status ==
(int)StatusEnum.Enabled) })
.ToList()