1

私は EF を使用して ASP.NET プロジェクトで作業していますが、正しいクエリを見つけるのに問題があります。遅延読み込みなしで作業する必要があります。

次のデータ構造があります。モジュールにはページが含まれています。Page には PageItems が含まれます。PageItem には Item が含まれます。Item には他の Item を含めることができます。

まず、Items を含む Items の再帰的な側面を除外して、1 つのモジュールの構造をツリービューにフィードするためのクエリが必要です。

私が欲しいのは:

  • 指定された ID を持つモジュール
    • すべてのページを含む
      • すべての PageItem を含む
        • ParentItem_ID == 0 のすべてのアイテムを含む
          • すべての 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に比較的慣れていないので、助けていただければ幸いです。

4

1 に答える 1

2

ネストされたコレクションで条件が必要な場合はjoin、次のように使用する必要があります。

(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()

(文脈上) と省略base._entitiesc、Id 名についていくつかの仮定を立て、奇妙な構文エラーを見落としている可能性がありますが、これは良い出発点になるはずです。

于 2012-04-26T17:45:40.683 に答える