【问题标题】:A lambda expression with a statement body cannot be converted to an expression tree [duplicate]带有语句体的 lambda 表达式不能转换为表达式树 [重复]
【发布时间】:2011-11-15 23:13:41
【问题描述】:

好的。所以也许我很懒。我不想新建一个 EF 对象,而必须在我的 linq 语句中定义所有属性。除非您想修改此对象中的属性,否则这很容易。在这种情况下,我的供应商名称属性可能会根据供应商是代理机构还是独立承包商而改变。

var results = db.tblSuppliers.Select(s => { s.SupplierName = s.CompanyName == null ? s.SupplierFirstName + " " + s.SupplierLastName : s.CompanyName; return s; });

return results.ToList<tblSupplier>();

我收到以下错误: 带有语句体的 lambda 表达式不能转换为表达式树

我想将此作为供应商对象列表返回。

【问题讨论】:

标签: linq entity-framework-4 lambda


【解决方案1】:

Select 用于转换操作。看起来您只想通过为每个元素设置 SupplierName 来改变对象...

您可以使用List.ForEach 来应用您想要的属性更改:

var results = db.tblSuppliers.ToList();
results.ForEach(s => s.SupplierName = s.CompanyName == null ? s.SupplierFirstName + " " + s.SupplierLastName : s.CompanyName);

【讨论】:

  • 谢谢。这可行,但我意识到我现在需要加入其他表以获取表中外键的描述。所以我真正想要的是“从表中选择*,desc1,desc2加入foreign1 ...加入foreign2。现在,在你所有的SQL纯粹主义者堆积在我身上并抨击我甚至认为“选择*”之前,我会满足于当它生成“脚本表为..”功能中的所有列时,它会生成我需要的所有属性,就像 sql management studio 所做的那样。
【解决方案2】:

您必须先将其放入内存并在那里进行投影 - 否则 Linq to Entities 将尝试将您的投影转换为 SQL 查询,当然没有等效的。您可以使用 AsEnumerable() 强制在 Linq to Objects 上下文中执行 Select() 投影,然后该上下文将起作用:

var results = db.tblSuppliers
                .AsEnumerable()
                .Select(s => { s.SupplierName = s.CompanyName == null ? s.SupplierFirstName + " " + s.SupplierLastName : s.CompanyName; return s; })
                .ToList();

第二个问题是您无法使用 EF 投影到实体,但使用 AsEnumerable() 也可以避免此问题。

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多