我知道类似的问题已经被问了很多次,但他们通常会要求 LINQ to Entities 支持它不支持的功能,或者提供的解决方案不是我想要的。
我有一个简单的查询,我想将其封装在扩展方法中,以便可以在任何地方使用:
public static Episode Latest(this ICollection<Episode> EpisodesSet)
{
return EpisodesSet.OrderByDescending(e => e.AiredDate).FirstOrDefault();
}
这将产生一个带有错误的 NotSupportedException:
LINQ to Entities 无法识别方法"[命名空间/类型/方法此处]"方法,并且此方法无法转换为存储表达式
因此,通过"简单查询",我的意思是 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 到实体查询中运行代码。那是不可能的。Linq to Entities 永远不会理解Latest()
的含义。
正如您所说,您可以做的是给出一个表达式并(可能)使用 LinqKit,以便在您需要它的任何位置重用它。
有几个选项可以将计算属性与 Linq to 实体一起使用。看看我的回答在这里。
您可能想要的是第二种选择。这样,您将能够执行以下操作:
var query = from show in context.Shows
select new {show.Title, show.LatestEpsiode};
前提是按照此处描述的方式在 Show
类中定义计算属性。