LINQ to SQLの結果を厳密に型指定されたクラス、つまり親と子に投影します。これらの2つのクエリ間の性能差が大きい:1対多投影LINQクエリが繰り返し実行される
スロークエリ - のDataContextからログインするには、各親のためのDBへの別のコールが行われていることを示して
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
高速クエリ - DataContextのショーからログイン必要なすべてのデータを返す単一のDBヒットクエリ
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
私は第二の例の単一問合せスタイルを使用してLINQを強制したいのですが、自分の子供を持つ親クラスを読み込むには、オブジェクトを直接。それ以外の場合、ChildプロパティはIQuerierable<Child>
で、Childオブジェクトを公開するために照会する必要があります。
参照された質問が私の状況に対処していないようです。 db.LoadOptionsを使用しても機能しません。おそらく型はDataContextに登録されたTEntityである必要があります。
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
注意:親子は、Table<TEntity>
ではなく、単純なタイプです。親と子の間に文脈上の関係はありません。サブクエリはアドホックです。
問題の要点:2番目のLINQの例ではIQueriable
ステートメントを実装し、ToList()
関数を呼び出さず、何らかの理由でLINQは必要なすべてのデータを取得できる1つのクエリを生成する方法を知っています。最初のクエリで達成されたように、実際のデータをアドホックプロジェクションにどのように埋め込むのですか?また、もし私の質問に誰かが助けてくれたら、私はそれを感謝します。
「子」はどのように「シンプルタイプ」になりますか?マップされた型である必要があります。そして 'parenttable'は' Table'か、前のlinqクエリの結果ですか?いくつかのlinq文によって、L2Sが結合からN + 1に切り替わる可能性があります。 –
マーカーの重複:エンティティフレームワークとlinqとSQLの違いを知っていますか? –
@GertArnold EF/L2SのLINQ部分は、よくこのような質問を機能的に重複していますが、この場合は完全に正しいと信じています。それらは重複していません。再開。 –