有没有办法将简单的 LINQ 查询封装在可与 LINQ 到实体查询一起使用的扩展方法中



我知道类似的问题已经被问了很多次,但他们通常会要求 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 类中定义计算属性。

最新更新