好。所以也许我很懒。我不想新建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表达式无法转换为表达式树
我想将其作为供应商对象的列表返回。
Select
用于转换操作。看起来你只是想通过为每个元素设置SupplierName
来改变对象。。。
您可以使用List.ForEach
应用您想要的属性更改:
var results = db.tblSuppliers.ToList();
results.ForEach(s => s.SupplierName = s.CompanyName == null ? s.SupplierFirstName + " " + s.SupplierLastName : s.CompanyName);
您必须先将其放入内存并在那里进行投影,否则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()
也可以避免这个问题。