2011-11-15 11 views
1

OK。だから多分私は怠け者だ。私は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>(); 

私は次のエラーを取得する:文の本体と ラムダ式は、式ツリー

に変換することはできません私はサプライヤオブジェクトのリストとしてこれをバック返すようにしたいです。

+0

可能性の重複:[「ラムダ式あなただけの各要素に対してSupplierNameを設定することで、オブジェクトを変異させたいようにそれはあなたがしたいプロパティの変更を適用するためにList.ForEachを使用することができ

...見えますステートメント本文を式ツリーに変換できません "](http://stackoverflow.com/q/5179341/299327) –

答えて

2

まず、それをメモリに持ち込んでそこに射影しなければなりません。そうしないと、Linq to Entitiesは投射をSQLクエリに変換しようとします。その後、動作するオブジェクトのコンテキストにLINQの中で実行されるSelect()投影を強制的にAsEnumerable()を使用することができます。

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は、変換操作に使用されます。

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

ありがとうございます。これはうまくいきますが、テーブルの外部キーの説明を取得するには、他のテーブルに参加する必要があることに気付きました。だから私が欲しいのは、 "select *、desc1、desc2 from table1 foreign1 ... join foreign2。"というようなものです。あなたはすべてSQLの純粋主義者の前に私を積み重ねて、 "select *"私がSQL管理スタジオのように必要なすべてのプロパティを生成するものは、「スクリプトテーブル」のすべての列を生成するときに機能します。 – SteveB

関連する問題