2009-03-13 13 views
12

Linq2SQLを使用してeager-loadingでデータを取得するのが好きです。コードは次のように似ています:複数のDataLoadOptionsを持つLinq2SQl eager load

 DataLoadOptions options = new DataLoadOptions(); 

     options.LoadWith<Product>(c => c.ProductCompanies); 

     options.LoadWith<Product>(c => c.OrderDetails); 

     db.LoadOptions = options; 

     IEnumerable<Product> products = db.Products.ToList<Product>(); 

私は期待どおりに1つ以上のSQLクエリを生成したことを確認します。実際には、ProductとOrderDetailsを使用してeager-loadingを実行し、ProductCompanyは1つずつ照会されます。私はここで何か悪いことをしましたか?それともLinq2SQLの問題ですか?回避策はありますか?

ありがとうございます!

更新: SQLプロファイラからSQLをチェックします。私はLeppieとIanの両方が正しいことを発見しました。それらは1つのトランザクションでバインドされています。しかし、私はそれを怠惰な負荷として設定すると、複数の接続を開きました。

+1

は注意してください、あまりにもこれを掲載している負荷を事前に及び繰延を残している他の人1(ランダム?)ピック(単にヒントLoadWithそれらを無視して)それを読み込みますDataLoadOptionsは非常に非効率なクエリを作成します。 –

+0

ありがとう、チャド!私は次のプロジェクトでNhibernateに戻ります:=) –

答えて

3

いいえ、間違ったことはありませんでしたが、Linq2SQLはすべてのトランザクションを1回のトランザクションでバッチしますが、必要な結果に対して無限の数のクエリを実行する可能性があります。 DataLoadOptionsは通常、結果の使用状況のコンテキスト全体でDataContextが利用できない場合にのみ使用されます。実行中にDataContextを有効にしておくことができれば、遅延実行(デフォルト)に依存することをお勧めします。ドキュメントによると

+0

ありがとう、レッピー!私はSQLプロファイルをチェックし、sqlsは1つのトランザクション内にあります。 –

2

あなたがオブジェクトに対してクエリを実行すると、あなたが実際にあなたが要求したオブジェクトだけを取り出します。関連するオブジェクトは、同時に自動的にフェッチされません。

DataLoadOptionsクラスは、指定された関連データの即時読み込みを実現する2つのメソッドを提供します。 LoadWithメソッドは、主ターゲットに関連するデータの即時ロードを可能にする。 AssociateWithメソッドは、関連オブジェクトのフィルタリングを可能にします。

複数のSQL文を使用しても私を驚かせることはできません。私は、ここでの違いは、すべてのステートメントが、必要に応じてロードするのではなく、怠惰なロードの前にロードされているということです。

+0

ありがとう、イアン!私はあなたが正しいと思います。 –

+2

驚くべきことは、 'LoadWith ' *はeager-loadingを保証しません: -/ –

16

私はいくつかのコードでもこの問題にぶつかりました。多くの実験とグーグルリングの後では、LINQは各テーブルの1対多の関係にのみ参加できるように見えます。

他の人とは、例えば

http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx

+2

いいリンク。そして、より良いことに、この回答は実際には質問に答えています。* "なぜドキュメントが誤っていますか?" 'LoadWith 'は、DataContextの有効期限を超えて項目にアクセスするときに、非常に簡単に*失敗するか*独自のこと*を行い、問題を引き起こします。私は効率についても気にしません - 私はちょうど作業意味論が欲しいです。私が効果的にこれに対処するために見つけた唯一の信頼できる方法は、DataContextスコープ内で手動で*強制的にアクセスすることです。 –