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

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

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

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


当前回答

这意味着TDelegate类型的Lambda表达式包含a ([parameters]) => {some code};不能转换为表达式<TDelegate>。这是规则。

简化您的查询。你提供的可以重写如下,并将编译:

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

其他回答

对于您的具体情况,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#编码惯例

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

正如在其他回复中所述,您只能使用=>操作符右侧的简单表达式。我建议这个解决方案,它只包括创建一个方法,做你想要在lambda中有的事情:

public void SomeConfiguration() {
    // ...
    Obj[] myArray = objects.Select(o => Method()).ToArray();
    // ..
}

public Obj Method() {
    var someLocalVar = o.someVar;

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

这意味着TDelegate类型的Lambda表达式包含a ([parameters]) => {some code};不能转换为表达式<TDelegate>。这是规则。

简化您的查询。你提供的可以重写如下,并将编译:

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

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

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

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