2010-12-07 4 views
1

私は何か間違ったことをしているのか、Entity Frameworkがこれを行うつもりがないのかを判断しようとしています。私は、LINQスタイルのクエリを実行して、子要素のリストを含め、オブジェクトを生成したいと考えています。 Linq2SQLでは、これは有効であり、結果が効率的なSQL照会に変換され、その結果が新しいリストに移入されます。 Entity Frameworkのではエンティティフレームワークはクエリで非エンティティクラスを使用できませんか?

class ReportItem 
{ 
    string Manager; /* ... */ 
    List<string> Employees; /* ... */ 
} 

var report = (from manager in entities.Managers 
       select new ReportItem() 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name).ToList() 
       }).ToList(); 

従業員数ラインmethod cannot be translated into a store expressionエラーになります - Entity Frameworkのは、それがどのデータベース側のロジックを必要としないにもかかわらず、LINQ文の内部で非エンティティクラスを構築したいとしていないようです。

変更トラッキングエンティティクラスが使用されていますが、は任意のクラスに情報を読み込むことはできません。すべての読み込みシナリオでエンティティとデータベースビューを構築する必要はなく、nameプロパティのようなものを読み込むためにパイプ全体(半分のEmployeeまたはManagerエンティティ)に半分のデータベースを送信したくありません。

Entity Frameworkでこのような「怠慢だが効率的な」クエリを実行することは可能ですか、それとも念頭に置かれていないEntity Frameworkですか?私はすでに、Linq2SQLからEntity Frameworkにプロジェクトを変換するいくつかの問題に直面しています。

答えて

1

LINQ to Entities パラメータのないコンストラクタと初期化子のみをサポートします。
具体的には、LINQ to Entitiesは、LINQクエリ式全体をサーバークエリに変換する必要があります。 の無関係なサブ式(クエリの式はサーバーの結果に依存しません)のみが、クエリが変換される前にクライアントで評価されます。既知の変換を持たない任意のメソッド呼び出しと、あなたのケースでパラメータ化された初期化子はであり、はサポートされていません。

言った、あなたは簡単に匿名型の投影することによって達成することができるを探しています:

var report = (from manager in entities.Managers 
       select new 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name) 
       }) 
       .ToList(); 
+0

残念ながら匿名型プロジェクトが考えられたが、私の場合、従業員と列挙のリストとの違い意味があった。しかし、これはまだEFの設計された行動についての私の本当の疑問に答える。ありがとうございました – David

関連する問題