“ LINQ 到实体中不支持 LINQ 表达式节点类型‘ Invoke’”——难住了!

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

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();
}
}

但是,我得到了上面提到的错误。看起来我通过从函数中构造一个谓词把所有事情都做对了。有什么想法吗?谢谢。

55311 次浏览

你试图通过一个武断的。NET 函数在... 实体框架如何希望翻译成 SQL?您可以将其改为使用 Expression<Func<int, bool>>,并从中构建 Where子句,尽管这并不容易,因为您需要使用不同的参数表达式重写表达式(即用调用 u.RelationTypeId的表达式替换原始表达式树中的任何参数表达式)。

老实说,为了在 lambda 表达式中指定 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 的带有 预测生成器的实体框架来构建动态 where子句。如果您碰巧处于相同的情况,您应该调用 AsExpandable方法:

如果使用 实体架构查询,请将最后一行更改为:

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

此方法是 LINQKITDLL 的一部分,您可以抓取 给你或通过 NuGet 包 给你

现在一切都很好。 :)

我知道这个答案已经很晚了,但是我也遇到了同样的问题,它把我带到了这里,所以我想我应该分享一下我的解决方案。

我读了 Leniel 的答案,我有了一个想法。默认类型具有方法“ AsEnumable ()”,其行为方式相同,从而减轻了问题。

可以在 Where请求之前调用 predicate上的 Expand()方法。