我发现的最接近我的问题是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)进一步调查。
答案 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方法: