无法将方法转换为商店表达式

时间:2015-07-16 20:53:07

标签: c# linq

我发现的最接近我的问题是this one,而且就我所知,它不是针对同一问题。我可能会弄错,在这种情况下,我希望有人可以解释相似性如何(除了引用错误的相同词语,即)。话虽如此,我有以下问题。

这应该是这样的。

List<Typo> things = context.Things.Where(thing => thing.Nice).ToList();

然而,这不是。

List<Typo> things = context.Things.Where(thing => IsNice(thing)).ToList();
...
private bool IsNice(Typo thing) { return thing.Nice; }

context 的类型为 ModelContainer 派生 DbContext 。我被告知这是EF的标准设置,我没有理由怀疑。错误消息声明如下。

  

{“LINQ to Entities无法识别方法XXX方法,并且此方法无法转换为商店表达式。”}

我对此错误没有经验,坦率地说,我所做的研究给了我很少的清晰度。我可以考虑什么(a)使其工作我的方式和(b)进一步调查。

2 个答案:

答案 0 :(得分:3)

IMO,它仍然与您提到的问题相同:LINQ to Entities无法解释IsNice,因此,您需要'正常'LINQ来解析Where方法。您可以使用AsEnumberable方法强制执行此操作:

List<Typo> things = context.Things.AsEnumerable().Where(thing => IsNice(thing)).ToList();

甚至更短。

List<Typo> things = context.Things.Where(IsNice).ToList();

答案 1 :(得分:3)

您不能在Linq to Entities的lambda表达式中使用自己的方法,即使它只封装了您的实体属性,因为Linq to Entities不知道如何将它们转换为有效的SQL语句。

为了使您的方法有效,您必须使用有效的LinQ to Entities查询从数据库中获取实体,并在其中填充C#集合(如List)。您可以使用扩展方法 .AsEnumerable(),. ToList(),Select(),...

这里有一个LinQ to Entities可以翻译的.NET方法列表,您可以在lambda表达式中使用,也可以简要说明异常:

CLR Method to Canonical Function Mapping

这里有一个列表,其中包含LinQ to Entities支持的LinQ方法:

Supported LinQ methods