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

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

    return new Obj() { 
    Var1 = someLocalVar,
    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();

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

其他回答

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

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

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

9年的时间太晚了,但是用不同的方法来解决你的问题(没有人提到过吗?)

语句体在Func<>时工作得很好,但在Expression<Func<>>时就不行了。这个IQueryable。Select需要表达式<>,因为它们可以转换为实体框架- Func<>不能。

所以你要么使用AsEnumerable并开始处理内存中的数据(不推荐,如果不是真的必要的话),要么继续使用IQueryable<>,这是推荐的。 有一个叫linq查询的东西可以让一些事情变得更简单:

IQueryable<Obj> result = from o in objects
                         let someLocalVar = o.someVar
                         select new Obj
                         {
                           Var1 = someLocalVar,
                           Var2 = o.var2
                         };

通过让你可以定义一个变量并在select(或where,…)中使用它-你可以继续使用IQueryable,直到你真正需要执行和获取对象。

然后你可以Obj[] myArray = result.ToArray()

使用重载select:

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

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

Arr是Obj的基础类型吗?Obj类存在吗?你的代码只有在Arr是Obj的基类型时才能工作。你可以试试这个:

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

    return new Obj() 
    { 
       Var1 = someLocalVar,
       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#编码惯例