Expression.Invoke 在实体框架中?

Posted

技术标签:

【中文标题】Expression.Invoke 在实体框架中?【英文标题】:Expression.Invoke in Entity Framework? 【发布时间】:2008-08-14 00:24:43 【问题描述】:

实体框架不支持Expression.Invoke 运算符。尝试使用时收到以下异常:

“LINQ to Entities 不支持 LINQ 表达式节点类型‘Invoke’。

有没有人解决这个缺失的功能?我想在实体框架上下文中使用详细的 PredicateBuilder here。

编辑 1 @marxidad - 我喜欢你的建议,但它确实让我有些困惑。您能否就您提出的解决方案提供进一步的建议?

编辑 2 @marxidad - 感谢您的澄清。

【问题讨论】:

是的,看起来 Entity Framework 不支持这一点,我也无法通过一种可行的方式对其进行评估。 查看 MSDN 上的 CLR Method to Canonical Function Mapping 页面。 【参考方案1】:

PredicateBuilder 和 LINQKit 现在支持实体框架。

对不起,伙计们,没有早点这样做!

【讨论】:

是的,现在可以了。只需在 .Where() 之前添加 AsExpandable() 即可。 当我添加 AsExpandable() 时,我收到“无法将类型为 'System.Linq.Expressions.MemberExpression' 的对象转换为类型 'System.Linq.Expressions.LambdaExpression'。”在 LambdaExpression lambda = (LambdaExpression)target; 行的 VisitInvocation【参考方案2】:

实体框架将 LINQ 表达式转换为实体命令树,并且在其中仅支持其规范函数。您必须使用带有规范函数的命令树来执行 PredicateBuilder 之类的操作。

【讨论】:

以上是关于Expression.Invoke 在实体框架中?的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中更新实体的最佳方法[重复]

在实体框架中找出导致异常的确切实体

撤消实体框架实体中的更改

实体框架分离实体和相关实体消失

在实体框架中更新具有所需属性的实体

防止在实体框架中的相关表实体上添加新记录