2012-04-12 6 views
4

私はLinqでよく使う1種類のリクエストを受け取りました。Linq:テーブル/リストをパラメータとしてリクエストを最適化する方法は?

IDの項目(またはその他の項目)が項目のリストにある一連のデータが必要です。 データを読み込むために(使用された)インクルードがたくさんあるので、これは重い要求です。

ですから、例えば:

私はこのような構造で、人とテーブルをしました:

Id; Name; Age; ... 

いくつかの外部キーでリンクテーブル、と私はそれらをロードする必要があるとして、この表データ: 車、会社、住所、...

そして今、私は特別な年齢を持つ人々のすべてのデータを取得したい:

List<int> ages = new List<int>(){7,17,27,37,47,57,67,77,87}; 
using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    return context.Persons.Include("Car").Include("Company").Include("Address") 
       .Where(p=>ages.Contains(p.Age)).ToList(); 
} 

問題は、私の「年齢」リストが変更されないことをLinqが知りませんし、すべてのデータ(Car、Company、...)正しい年齢であればすべての結果をチェックします。

So.

  1. 私は正しいですか?
  2. これを避ける方法は?

答えて

2

あなたは、このように投影を使用することができます。

using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    return context.Persons 
    .Where(p => ages.Contains(p.Age)) 
    .Select(p => new {p, p.Car, p.Company, p.Address}) 
    .ToList(); 
} 
1
  1. 私はあなたが間違っていると思う:あなたは「ToListメソッド()」の呼び出しの前に(あなたのクエリを「列挙」していないながらにあなたのケース)、あなたは何も「ドンロード」しません。しかし、SQLで生成されたコードは多分そのようなものではありません。

あなたはあなたのコードをデバッグしようとすることができます:「VARクエリ」にbreakpoingを入れて、SQLが生成された参照、 それをコピーし、それを試してみてください

var yourQuery = context.Persons.Include("Car").Include("Company").Include("Address") 
       .Where(p=>ages.Contains(p.Age)); 

var HarmQuery = context.Persons 
    .Where(p => ages.Contains(p.Age)) 
    .Select(p => new {p, p.Car, p.Company, p.Address}); 


return yourQuery.ToList(); 

いずれかのSQLプロファイラ、または単に

あなたのdbの指示、両方のパフォーマンスを調べる。

EDIT:あなたが取得され、「含まれる」と

.Select(p => new{p, p.Car.Name, p.Company.Id, p.Address.Street, p.Address.StreetNumber) 

行うことができないもの: 投影は確かにあなたの必要性あなたの「リンク」のエンティティのプロパティのサブセットのみがあれば含んよりも優れています含まれるエンティティのすべてのプロパティ

関連する問題