在使用EntityFramework时,当我试图编译以下代码时,我得到了错误“带有语句体的lambda表达式不能转换为表达式树”:

Obj[] myArray = objects.Select(o =>
{
    var someLocalVar = o.someVar;

    return new Obj() { 
    Var1 = someLocalVar,
    Var2 = o.var2 };
}).ToArray();

我不知道这个错误意味着什么,最重要的是如何修复它。任何帮助吗?


当前回答

这意味着你不能在lambda表达式需要转换为表达式树的地方使用带有“语句体”的lambda表达式(即使用花括号的lambda表达式)(例如使用linq2sql时的情况)。

其他回答

对象是Linq-To-SQL数据库上下文吗?在这种情况下,只能使用=>运算符右侧的简单表达式。原因是,这些表达式不会被执行,而是被转换为SQL,然后对数据库执行。 试试这个

Arr[] myArray = objects.Select(o => new Obj() { 
    Var1 = o.someVar,
    Var2 = o.var2 
}).ToArray();

你可以在IEnumerable集合的lamba表达式中使用语句体。 试试这个:

Obj[] myArray = objects.AsEnumerable().Select(o =>
{
    var someLocalVar = o.someVar;

    return new Obj() 
    { 
        Var1 = someLocalVar,
        Var2 = o.var2 
    };
}).ToArray();

注意: 在使用此方法时要仔细考虑,因为这样,所有查询结果都将保存在应用程序的内存中,这可能会对其余代码产生不必要的副作用。

这意味着你不能在lambda表达式需要转换为表达式树的地方使用带有“语句体”的lambda表达式(即使用花括号的lambda表达式)(例如使用linq2sql时的情况)。

对于您的具体情况,body是用于创建变量,切换到IEnumerable将强制所有操作在客户端处理,我提出以下解决方案。

Obj[] myArray = objects
.Select(o => new
{
    SomeLocalVar = o.someVar, // You can even use any LINQ statement here
    Info = o,
}).Select(o => new Obj()
{
    Var1 = o.SomeLocalVar,
    Var2 = o.Info.var2,
    Var3 = o.SomeLocalVar.SubValue1,
    Var4 = o.SomeLocalVar.SubValue2,
}).ToArray();

编辑:重命名为c#编码惯例

不知道更多关于你在做什么(Linq2Objects, Linq2Entities, Linq2Sql?),这应该使它工作:

Arr[] myArray = objects.AsEnumerable().Select(o => {
    var someLocalVar = o.someVar;

    return new Obj() { 
        Var1 = someLocalVar,
        Var2 = o.var2 
    }; 
}).ToArray();