2

我知道类似的问题已经被问过很多次,但他们通常要求 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]' 方法,并且此方法无法转换为存储表达式

因此,“简单查询”是指OrderByDescending(expression).FirstOrDefault()LINQ to Entities 支持/可翻译。另外,我知道我可以编写一个返回表达式的函数并执行类似的操作episode = Episodes.Where(Latest()),但这似乎不是很“可发现”,也不是我正在寻找的解决方案。

我想知道是否有办法重写我的扩展方法,以便当我尝试使用这样的扩展方法时 LINQ to Entities 不会抛出 NotSupportedException:

var query = from show in context.Shows      
            select new {show.Title, show.Epsiodes.Latest()};
4

1 回答 1

0

你想要的是一些计算属性:

show.Epsiodes.Latest()

基本上,您想在 Linq to Entities 查询中运行代码。那是不可能的。Linq to Entities 永远不会明白是什么Latest()意思。

正如您所说,您可以做的是提供一个表达式并(可能)使用 LinqKit 以便在您需要的任何地方重用它。

有几个选项可以将计算属性与 Linq to Entities 一起使用。看看我这里的回答。

您可能想要的是第二个选项。这样,您将能够执行以下操作:

var query = from show in context.Shows      
            select new {show.Title, show.LatestEpsiode};

前提是您按照此处Show描述的方式在类中定义计算属性。

于 2013-11-14T23:40:46.370 回答