[英]Is there any way to encapsulate a simple LINQ query in an extension method that can be used with LINQ to Entities query?
我知道已经问过很多类似的问题,但是他们通常会问LINQ to Entities以支持它不提供的功能,或者所提供的解决方案不是我想要的。
我有一个简单的查询,我想将其封装在扩展方法中,以便可以在任何地方使用:
public static Episode Latest(this ICollection<Episode> EpisodesSet)
{
return EpisodesSet.OrderByDescending(e => e.AiredDate).FirstOrDefault();
}
这将产生一个NotSupportedException并显示以下错误:
LINQ to Entities无法识别方法'[namespace / type / method here]'的方法,并且该方法无法转换为商店表达式
因此,“简单查询”是指LINQ支持/可翻译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()};
您想要的是一些计算属性:
show.Epsiodes.Latest()
基本上,您想在Linq to Entities查询中运行代码。 那是不可能的。 Linq to Entities将永远无法理解Latest()
含义。
正如您所说,您可以做的是提供一个Expression并(可能)使用LinqKit以便在需要它的任何地方重用它。
有两个选项可将计算的属性与Linq to Entities一起使用。 在这里看看我的回答。
您可能想要的是第二种选择。 这样,您将可以执行以下操作:
var query = from show in context.Shows
select new {show.Title, show.LatestEpsiode};
前提是你在你的定义计算属性Show
类中记载的方式在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.