次の構造のスキーマがあります。
基本的に、メニューにはネストされた子を含めることができます。そして、他のテーブルは単に保持し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 日からこれを解決しようとしています. これに関するヘルプは評価できます。