2012-04-10 16 views
0

私は、リストを使用するビジネスオブジェクトにクエリを投影するクエリを実行しています。 LINQ to Entitiesでは、パラメータなしのコンストラクタとイニシャライザのみがサポートされているという不満がエンティティへのLinqの問題です。リストを含む新しい項目を投影する

私はこの上に私の髪を引っ張ってきました。単一の項目のみではなく、それらのコレクションを受け入れるように思われるような、私は初期化子を使用することはできません

var q = from d in db.Items select new BusinessObject 
    { 
     MyList = new List<MyObject>(d.Select(x => new MyObject {// set fields}) 
    } 

:私のクエリは次のようになります。私は.ToList()を実行できません。なぜなら、EFはMyObjectのリストが何であるかわからないからです(明らかに、SQLに変換しようとしています)。

私は親テーブルの各行に新しいリストが必要なので、クエリの外にリストを作成することはできません。

ここにはどのような候補がありますか?

+0

@HenkHolterman - 定義はマイリストは(コードから明らかである)一覧であるという事実以外に、無関係です。 MyObjectのフィールドは無関係で、問題とは関係ありません。 –

答えて

0

クエリは私にとって奇妙に見えます--dbとは何ですか?あなたのコンテキストやIQueryableプロパティになっているはずですか?

BusinessObjectsコレクションのクエリを実行した後、Itemsプロパティを読み込んだ後、Itemsプロパティをメモリ内コレクション:

var q = db.BusinessObjectsContextProperty.Select(d => d.items) //eager load the items property 
    .ToList() // get it into memory 
    .Select(d => new BusinessObject { MyList = d.items 
     .Select(item => new MyObject { ... }) // project the in-memory list 
    ); 
+0

申し訳ありませんが、db.Items(はい、それはDbSet)である必要があります、クエリの最初の部分に誤植。これははるかに複雑なクエリの大幅な単純化です。一番上の段階でそれをメモリにプルすると、数十万のレコードがメモリに持ち込まれます。 –

+1

ToListを正しいポイントで実行すると、必要以上の行がメモリに持ち込まれることはありません。 –

関連する問題