“LINQexpression式节点types”调用“不支持LINQ to Entities” – 难住!

在我的EF后来,我试图传递一个匿名函数作为我的Linq查询的一部分。 该函数将传入一个INT并返回一个BOOL(u.RelationTypeId是一个INT)。 以下是我的function的简化版本:

public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation) { using (var ctx = new OpenGroovesEntities()) { Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId); var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

但是,我得到上述错误。 看起来我正在通过构build函数的谓词来正确地处理所有事情。 有任何想法吗? 谢谢。

你正在尝试传递一个任意的.NET函数…entity framework怎么可能把它转换成SQL呢? 你可以改变它来取代一个Expression<Func<int, bool>> ,然后构buildWhere子句,虽然它不会特别容易,因为你需要用不同的参数expression式重写expression式(即将原始expression式树中的任何参数expression式replace为调用u.RelationTypeId的expression式)。

说实话,为了只是在用来创buildexpression式树的lambdaexpression式中指定u.RelationTypeId来传入方法,最好使用:

 public IEnumerable<UserBandRelation> GetBandRelationsByUser( Expression<Func<UsersBand, bool>> predicate) { using (var ctx = new OpenGroovesEntities()) { var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

我得到这个错误,我用Joe Albahari的PredicateBuilder使用entity framework来构builddynamicwhere子句。 如果碰巧处于相同的状态,则应该调用AsExpandable方法:

如果使用entity framework查询,请将最后一行更改为:

return objectContext.Products.AsExpandable().Where(predicate);

这个方法是LINQKIT DLL的一部分,你可以在这里或通过NuGet包在这里抓取。

现在一切正常。 🙂

您可以在where请求之前调用谓词的 Expand()方法

我知道这个答案真的很晚,但是我遇到了同样的问题,并且把我带到了这里,所以我想我会分享我的解决scheme。

我读了Leniel的回答,这给了我一个主意。 默认types的方法是“AsEnumerable()”,其行为方式相同,可以缓解问题。