2011-11-15 62 views
1

OK。所以也许我很懒。我不想创建一个EF对象,并且必须在我的linq语句中定义所有的属性。除非要修改此对象中的属性,否则这很简单。在这种情况下,我的供应商名称属性可能会根据供应商是代理商还是独立承包商而有所不同。带声明正文的lambda表达式无法转换为表达式树

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

return results.ToList<tblSupplier>(); 

我得到以下错误: 与语句体lambda表达式不能转换为表达式树

我想退掉这回是供应商对象的列表。

+0

可能重复:“lambda表达式与声明正文不能转换为表达式树“](http://stackoverflow.com/q/5179341/299327) –

回答

2

您必须首先将其带入内存并在那里进行投影 - 否则Linq to Entities会尝试将您的投影转换为SQL查询,这当然不存在等价物。您可以使用AsEnumerable()迫使Select()投影在LINQ到被执行的对象范围内,然后将工作:

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

第二个问题是,你不能投射到与EF实体,但使用AsEnumerable()避免了这个问题,以及。

2

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

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

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

谢谢。这有效,但我意识到我需要现在加入到其他表中,以获取我的表中的外键的描述。所以我真正想要的就是“Select *,desc1,desc2 from table join foreign1 ... join foreign2。现在,在你所有的SQL纯粹主义者堆积在我身上,甚至在思考”select *“的时候鞭挞我,我会为这些东西可以创建我需要的所有属性,比如sql管理工作室在创建“脚本表中的所有列”功能时所做的所有属性。 – SteveB