有没有办法在可以与LINQ to Entities查询一起使用的扩展方法中封装一个简单的LINQ查询?

时间:2013-11-13 16:02:37

标签: c# linq entity-framework linq-to-entities notsupportedexception

我知道有很多次问过类似的问题,但是他们通常要求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()};

1 个答案:

答案 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的方式定义计算属性。

相关问题