我知道有很多次问过类似的问题,但是他们通常要求LINQ to Entities支持它没有的功能,或者提供的解决方案不是我想要的。
我有一个SIMPLE查询,我希望将其封装在扩展方法中,以便它可以在任何地方使用:
public static Episode Latest(this ICollection<Episode> EpisodesSet)
{
return EpisodesSet.OrderByDescending(e => e.AiredDate).FirstOrDefault();
}
这会产生一个带有错误的NotSupportedException:
LINQ to Entities无法识别方法'[namespace / type / method here]'方法,并且此方法无法转换为商店表达式
因此,通过“简单查询”,我的意思是LINQ to Entities支持/翻译OrderByDescending(expression).FirstOrDefault()
。另外,我知道我可以编写一个函数来返回一个表达式,并执行类似episode = Episodes.Where(Latest())
的操作,但这似乎不是“可发现的”,并不是我正在寻找的解决方案。
我想知道是否有办法重写我的扩展方法,以便当我尝试使用这样的扩展方法时,LINQ to Entities不会抛出NotSupportedException:
var query = from show in context.Shows
select new {show.Title, show.Epsiodes.Latest()};
答案 0 :(得分:0)
你想要的是一些计算属性:
show.Epsiodes.Latest()
基本上,您希望在Linq to Entities查询中运行代码。那是不可能的。
Linq to Entities永远不会理解Latest()
的含义。
正如您所说,您可以做一个表达式并且(可能)使用LinqKit,以便在您需要的任何地方重复使用它。
有几个选项可以使用Linq to Entities的计算属性。看看我的回答here。
你可能想要的是第二种选择。这样你就可以做到这样的事情:
var query = from show in context.Shows
select new {show.Title, show.LatestEpsiode};
前提是您在Show
课程中按照here的方式定义计算属性。