具有语句主体的lambda表达式无法转换为表达式树

时间:2011-11-15 23:13:41

标签: linq entity-framework-4 lambda

行。也许我很懒。我不想新建一个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表达式无法转换为表达式树

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

2 个答案:

答案 0 :(得分: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()也可以避免此问题。

答案 1 :(得分:2)

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

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

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