繁体   English   中英

有没有什么方法可以将简单的LINQ查询封装为可与LINQ to Entities查询一起使用的扩展方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM