2016-07-22 6 views
0

を含むので、ここでは私のテーブルのクイックバージョンです。私が欲しいもの子の基準の子に基づいて親オブジェクトを取得し、

public class Line 
{ 
    // Bunch Of properties 
    // ... 
    public List<Tool> Tools {get;set;} 
} 

public class Tool 
{ 
    // Bunch Of properties 
    // ... 
    public List<Task> Tasks {get;set;} 
} 

public class Task 
{ 
    // Bunch Of properties 
    // ... 
    public List<SchedItem> SchedItems {get;set;} 
} 

public class SchedItem 
{ 
    public DateTime SchedDate {get;set;} 
} 

SchedItem.SchedDateは、日付の範囲内であるか否かに基づいて、子コレクションとその子のコレクションなどを含むすべてのLinesを返しますクエリです。

LinqPadで次のように試しました。返されたデータがクエリに基づいて、すべてのSchedItemsだけでなく、ものを含めているよう

var line = (from p in Lines.Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems))) 
         from t in p.Tools 
         from m in t.Tasks 
         from s in m.SchedItems 
         where s.SchedDate >= StartDateQuery && 
           s.SchedDate <= EndDateQuery 
         select p); 

これは私には間違っているようです。

更新1: ええ、私は私の理解が間違っていると思います。私は、私は再びコードを実行すると、私はノー子項目を持つ33のLine項目のリストを取得し、私のコンテキストコンフィギュレーションに

db.Configuration.LazyLoadingEnabled = false; 
db.Configuration.ProxyCreationEnabled = false; 

を次のように設定しています。多くの子アイテムを含む1つの 'Line'アイテムのみが必要です。

私のクエリをこれに変更しましたが、今は子アイテムを取得しますが、Lineカウントはまだ33ですが間違っています。

var line = (from p in Lines 
         from t in p.Tools 
         from m in t.Tasks 
         from s in m.SchedItems 
         where s.SchedDate >= StartDateQuery && 
           s.SchedDate <= EndDateQuery 
         select p).Include(x => x.Tools.Select(m => m.Tasks.Select(s => s.SchedItems))); 
+1

これは何度も尋ねられたと思います。熱心な読み込み負荷**エンティティ**。それはすべてかどうかです。例えば'Task.ShedItems'は、** entity **の観点からそうであるため、ロードされると、すべての項目を含みます。フィルタリングを適用する場合は、 'Include'ではなく投影を使用することになっています(このようなシナリオでは無視されます)。 –

+0

ああ、ありがとう、私はこれを調べます。 – Gaz83

答えて

1

この

var lines = Lines.Where(i => 
       i.Tools.Any(t => 
          t.Tasks.Any(y => 
            y.SchedItems.Any(u => 
               u.SchedDate >= StartDateQuery && 
               s.SchedDate <= EndDateQuery 
               ) 
             ) 
           ) 
       ); 

lines.ForEach(i => new 
       { 
        i.Tools = i.Tools.Where(t => 
               t.Tasks.Any(y => 
                 y.SchedItems.Any(u => 
                    u.SchedDate >= StartDateQuery && 
                    s.SchedDate <= EndDateQuery 
                    ) 
                  ) 
             ); 
        i.Tools.ForEach(t => new 
        { 
         t.Tasks = t.Tasks.Where(y => 
                y.SchedItems.Any(u => 
                   u.SchedDate >= StartDateQuery && 
                   s.SchedDate <= EndDateQuery 
                   ) 
               ); 
        }); 
       } 
      ); 
+0

@Kedrzuへの私の返答を見る – Gaz83

+0

@ Gaz83回答が更新されました。 – NEER

+0

@Kedrzuはコピー&ペーストを試みたばかりですが、最初のエラーは 'lines.Foreach'でした。視覚スタジオは' foreach'を解決できないと言っています。 – Gaz83

1

あなたのコードが原因で夫婦from文のデカルト積を作成してみます。 DbContextの設定をスキップし、遅延ロードを有効にしたと仮定します。これを試してみてください:、SchedItem、タスク、ツールの要件を満たすSchedItemsを見つけるとラインに両親をナビゲート:あなたの目標を達成するために

var line = from p in ls 
      where p.Tools 
       .Any(to=> to.Tasks 
        .Any(ta=> ta.SchedItems 
         .Any(s=> s.SchedDate >= StartDateQuery && s.SchedDate <= EndDateQuery))); 
      select p; 

もう一つの方法は、にparrentを追加することです。詳細についてはhere

+0

これを試してみました。 'Line'項目の私がまだ持っている問題は、関連する子アイテムを含める必要があるということです。また、LinqPadの子アイテムを展開すると、SchedItemsに行き、 'SchedDate'基準に基づいたアイテムだけでなく、すべてのアイテムが含まれていることがわかります – Gaz83

関連する問題