2

次の構造のスキーマがあります。
ここに画像の説明を入力

基本的に、メニューにはネストされた子を含めることができます。そして、他のテーブルは単に保持しItemType、そのアイテムの Id を保持しますItemTypeId(これらは、ユーザーがバックエンドでオプションを選択するときに動的に参照されます)。ここで、メニューを表示するために、ここでInner Joinを使用しました (ここでLeft Outer Joinを使用したい)。

public IQueryable<Menu> GetMenuWithAsset()
{
    return DbContext.Set<Menu>()
                    .Join(DbContext.Set<Asset>(), m => m.MenuId, a => a.MenuId, (m, a) => m);
}

私のベースコントローラーでは、このようにフェッチしています。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var menus = Uow.Menus.GetMenuWithAsset()

        .Select(m => new ParentMenuViewModel()
        {
            MenuId = m.MenuId,
            Name = m.Name,
            ParentId = m.ParentId
        })
        .ToList<ParentMenuViewModel>();
    ViewBag.Menus = CreateVM(0, menus);
    base.OnActionExecuting(filterContext);
}

public IEnumerable<ParentMenuViewModel> CreateVM(int parentid, List<ParentMenuViewModel> list)
{
    var newList = list.Where(m=> m.ParentId==parentid)
        .Select(m=> new ParentMenuViewModel()
        {
            MenuId = m.MenuId,
            Name = m.Name,
            ParentId = m.ParentId,
            ChildMenus = CreateVM(m.MenuId, list)
        });
    return newList;
}

そして、このコードは期待どおりに正しく機能します。ただし、ここに私が欲しいものがあります。
1)テーブルにデータがあるかどうかに関係なく、すべてのメニュー(子メニューを含む)を表示したいAsset(私は左外部結合を推測します)。
2) 両方のテーブルから次のプロパティを保持する強く型付けされたビューモデルを使用してこれを実現したい
i) MenuId ii) 名前 iii)ParentId iv) ChildMenus v)MenuItemType vi) MenuItemTypeId

私は 4 日からこれを解決しようとしています. これに関するヘルプは評価できます。

4

1 に答える 1

0

このクエリを試してください:

DbContext.Set<Menu>()
         .GroupJoin(DbContext.Set<Asset>(), m => m.MenuId, a => a.MenuId, (m, as) => new { m, as = as.DefaultIfEmpty() });

タイプ Menu のプロパティ m と資産の IQueriable を含むプロパティ as を持つ anonymus クラスを返します。これがあなたの望むものであることを願っています。

于 2013-05-30T16:35:45.503 に答える