编译器错误:“带有语句主体的 Lambda 表达式无法转换为表达式树”
使用 EntityFramework 时,您可能会遇到错误声明:“带有语句主体的 lambda 表达式无法转换为表达式树。”当您尝试在仅允许表达式 lambda 的上下文中使用带有块语句(也称为语句 lambda)的 lambda 表达式时,会发生此错误。
问题
如错误消息所示,EntityFramework 需要表达式 lambda,它们是没有任何块语句的简洁表达式。在提供的示例中,lambda 表达式:
Obj[] myArray = objects.Select(o => { var someLocalVar = o.someVar; return new Obj() { Var1 = someLocalVar, Var2 = o.var2 }; });
包含块语句,使其成为语句 lambda。 EntityFramework 无法将此表达式转换为适合执行数据库查询的形式。
解决方案
要解决该错误,请重构您的 lambda 表达式以使用表达式 lambda。表达式 lambda 是单行表达式,无需使用任何其他语句即可直接返回值。在这种情况下,您可以将 lambda 重写如下:
Obj[] myArray = objects.Select(o => new Obj() { Var1 = o.someVar, Var2 = o.var2 });
这个表达式 lambda 消除了 block 语句,直接返回一个新的 Obj 对象。这种形式与EntityFramework对表达式树的期望兼容,并且将解决编译错误。
以上是为什么实体框架抛出'带有语句主体的 Lambda 表达式无法转换为表达式树”?的详细内容。更多信息请关注PHP中文网其他相关文章!