2012-04-26 6 views
1

私はASP.NETプロジェクトでEFを使用していますが、正しいクエリを見つけるためにいくつか問題があります。 私は遅延ロードせずに作業する必要があります。LINQ:入れ子にされた選択ステートメントを条件付きにする方法

私は次のデータ構造を持っています: モジュールにはページが含まれています。 ページにはPageItemsが含まれています。 PageItemにはItemが含まれています。 アイテムは他のアイテムを含むことができます。

最初に項目を含む項目の再帰的な側面を残して、単一のモジュールの構造をツリービューに供給するためのクエリが必要です。

私は何をしたいことは次のとおりです。

  • モジュールParentItem_ID == 0
      を持つすべての項目を含むすべてのPageItems
      • を含むすべてのページ
        • 含む所定ID
          • すべてのChildItemを含む

私はこれを開始しました:ページの直接の子としてのすべてのアイテムをこのクエリは動作しますが、それはアイテム階層とディスプレイを無視

return base._entities.Modules 
      .Include(m => m.Paginas 
       .Select(p => p.PaginaItems 
        .Select(pi => pi.Item) 
        .Select(i => i.ChildItems))) 
      .Where(m => m.Module_ID == id) 
      .FirstOrDefault(); 

。実際に必要なのは次のようなものです:

return base._entities.Modules 
      .Include(m => m.Paginas 
       .Select(p => p.PaginaItems 
        .Select(pi => pi.Item) 
        .Where(i => i.I_ParentItem_ID == 0) 
        .Select(i => i.ChildItems))) 
      .Where(m => m.Module_ID == id) 
      .FirstOrDefault(); 

しかし、それは動作しません。

私は比較的新しいLINQになりました。どんな助けでも本当に感謝しています。

+0

この場合、明示的な 'join'を使うべきです。 –

+0

どうすればいいですか? – ckonig

+0

答えを見てください。 –

答えて

2

あなたは、ネストされたコレクション内の条件を必要とするとして、あなたのようなjoinを、使用する必要があります。私は(コンテキスト用)cbase._entitiesを省略し、ID名に関するいくつかの仮定を作り、おそらく奇数を見落とし

(from mod in c.Modules 
join pag in c.Paginas on mod.Module_Id equals pag.Module_Id 
join pi in c.PaginaItems on pag.Pagina_Id equals pi.Pagina_Id 
join item in c.Items.Where(i => i.I_ParentItem_ID == 0) on pi.PaginaItem_Id 
    equals item.PaginaItem_Id 
join ci in c.ChildItems on item.I_ParentItem_ID equals ci.I_ParentItem_ID 
select mod).FirstOrDefault() 

構文エラーですが、これは良いスタートになるはずです。

+0

WOWは本当に役に立ちました。今私はそれを持っている。クエリを少し変更する必要がありましたが、select modではなくselect new {mod、pag、pi、item}を記述してからqry.modを返さなければなりませんでした。 – ckonig

関連する問題