public IList <RouteMenuItem> GetTopLevelMenus(MenuParentFilter <int?, string> parentFilter)
        {
            //TODO:think about rightness of this act
            parentFilter.InitHierarchy = false;
            parentFilter.ParentId      = null;
            return(GetRouteMenuItems(parentFilter).AsEnumerable().Select(it => new RouteMenuItem
            {
                Id = it.Id,
                Name = it.Name,
                RouteName = it.RouteName,
                RouteParams = it.RouteParams?.ToDictionary(kv =>
                                                           kv.Name, kv => kv.Value),
                ParentId = it.ParentId
            }).ToList());
            //return (from menu in Db.Set<MenuItem>()
            //    join menuRelation in Db.Set<RoleMenuItemRelation>() on menu.Id equals menuRelation.MenuItemId
            //    join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId
            //        equals menuItemRelationGroup.Id
            //    join routeName in Db.Set<RouteName>() on menuRelation.RouteNameId equals routeName.Id
            //    let routeParams = Enumerable.ToDictionary((from entity in Db.Set<MenuItemRelationRouteValue>()

            //        join routeParam in Db.Set<RouteParam>() on entity.RouteParamId equals routeParam.Id
            //        where entity.MenuItemRelationId == menuRelation.Id
            //        select new { Key = routeParam.Name, Value = entity.Value }
            //        ), it => it.Key, it => it.Value)
            //    where menuItemRelationGroup.Name == filter.MenuItemGroup && menu.ParentId == null
            //    select new { menu, routeName, routeParams }).ToList().Select(it => new RouteMenuItem
            //        {
            //            Id = it.menu.Id,
            //            RouteName = it.routeName.Name,
            //            ParentId = it.menu.ParentId,
            //            Name = it.menu.Name,
            //            RouteParams = it.routeParams
            //        }).ToList();
        }
 public List <RouteMenuItem> GetSubMenus(MenuParentFilter <int?, string> parentFilter)
 {
     if (!parentFilter.ParentId.HasValue)
     {
         throw new ArgumentNullException("filter.ParentId");
     }
     return(GetRouteMenuItems(parentFilter).ToList().Select(it => new RouteMenuItem
     {
         Id = it.Id,
         RouteName = it.RouteName,
         ParentId = it.ParentId,
         Name = it.Name,
         RouteParams = it.RouteParams.ToDictionary(it2 => it2.Name, it2 => it2.Value)
     }).ToList()); //GetSubMenus(filter.ParentId.Value);
 }
        //TODO:Extract
        //public IList<Good> GetGoodList(int menuID)
        //{
        //    return (from menuGoods in Db.Set<MenuGood>()
        //            join good in Db.Set<Good>() on menuGoods.GoodId equals good.Id
        //            where menuID == menuGoods.MenuId
        //            select good).ToList();
        //}
        //public IList<Good> GetGoodList(MenuItem menu)
        //{
        //    return GetGoodList((int) menu.Id);
        //}

        //public Task<IList<Good>> GetGoodListAsync(int menuID)
        //{
        //    return Task<IList<Good>>.Factory.StartNew(() => GetGoodList(menuID));
        //}

        //public Task<IList<Good>> GetGoodListAsync(MenuItem menu)
        //{
        //    return Task<IList<Good>>.Factory.StartNew(() => GetGoodList(menu));
        //}

        public List <RouteMenuItem> GetLayoutRelatedMenus(MenuParentFilter <int?, string> parentFilter)
        {
            return(GetRouteMenuItems(parentFilter).AsEnumerable().Select(it => new RouteMenuItem
            {
                Id = it.Id,
                Name = it.Name,
                RouteName = it.RouteName,
                RouteParams = it.RouteParams.ToDictionary(kv =>
                                                          kv.Name, kv => kv.Value),
                ParentId = it.ParentId
            }).ToList());

            //(from menu in Db.Set<MenuItem>()
            //join menuRelation in Db.Set<UserMenuItemRelation>() on menu.Id equals menuRelation.MenuItemId
            //join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId
            //    equals menuItemRelationGroup.Id
            //join routeName in Db.Set<RouteName>() on menuRelation.RouteNameId equals routeName.Id
            //let routeParams = (from entity in Db.Set<MenuItemRelationRouteValue>()

            //    join routeParam in Db.Set<RouteParam>() on entity.RouteParamId equals routeParam.Id
            //    where entity.MenuItemRelationId == menuRelation.Id
            //    select new { Key = routeParam.Name, Value = entity.Value }
            //    )
            //where menuItemRelationGroup.Name == filter.MenuItemGroup
            //select new { menu, routeName, routeParams }).ToList().Select(it => new RouteMenuItem
            //    {
            //        Id = it.menu.Id,
            //        RouteName = it.routeName.Name,
            //        ParentId = it.menu.ParentId,
            //        Name = it.menu.Name,
            //        RouteParams = it.routeParams.ToDictionary(it2 => it2.Key, it2 => it2.Value)
            //}).ToList();
            //return (from menu in Db.Set<MenuItem>()
            //        join menuRelation in Db.Set<MenuItemRelation>() on menu.Id equals menuRelation.MenuItemId
            //        join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId
            //            equals menuItemRelationGroup.Id
            //        where menuItemRelationGroup.Name == filter.MenuItemGroup
            //        select menu).ToList().Select(it => new RouteMenuItem
            //        {

            //        }).ToList();
        }
 public IList <RouteMenuItem> GetTopLevelMenus(MenuParentFilter <int?, string> parentFilter)
 {
     //TODO:think about rightness of this act
     parentFilter.InitHierarchy = false;
     parentFilter.ParentId      = null;
     try
     {
         var result = GetRouteMenuItems(parentFilter).AsEnumerable().Select(it => new RouteMenuItem
         {
             Id          = it.Id,
             Name        = it.Name,
             RouteName   = it.RouteName,
             RouteParams = it.RouteParams?.ToDictionary(kv =>
                                                        kv.Name, kv => kv.Value),
             ParentId = it.ParentId
         }).ToList();
         return(result);
     }
     catch (Exception ex)
     {
         LogEventManager.Logger.Error(ex.Message, ex);
         throw;
     }
 }
        public IEnumerable <RouteMenuItem> GetMenuItems(MenuParentFilter <int?, string> parentFilter)
        {
            var result = new List <RouteMenuItem>();

            foreach (var ri in GetRouteMenuItems(parentFilter))
            {
                var item = new RouteMenuItem
                {
                    Id          = ri.Id,
                    Name        = ri.Name,
                    RouteName   = ri.RouteName,
                    RouteParams = ri.RouteParams.ToDictionary(kv =>
                                                              kv.Name, kv => kv.Value),
                    ParentId = ri.ParentId
                };
                parentFilter.ParentId = ri.Id;
                if (parentFilter.InitHierarchy)
                {
                    item.Children = GetMenuItems(parentFilter);
                }
                result.Add(item);
            }
            return(result);
        }
        protected IQueryable <RouteQueryResult> GetRouteMenuItems(MenuParentFilter <int?, string> parentFilter)
        {
            var realFilter     = parentFilter as UserBasedMenuParentFilter <int?, int?, string>;
            var filterHasValue = realFilter != null;
            var query          = (from menuItemRelation in Db.Set <UserMenuItemRelation>()
                                  join menuItem in Db.Set <MenuItem>() on menuItemRelation.MenuItemId equals menuItem.Id
                                  join routeName in Db.Set <RouteName>() on menuItemRelation.RouteNameId equals routeName.Id
                                  join menuItemRelationGroup in Db.Set <MenuItemRelationGroup>() on
                                  menuItemRelation.MenuItemRelationGroupId equals menuItemRelationGroup.Id


                                  //from menuItemRouteValue in tmprelationRouteValues.DefaultIfEmpty()
                                  //join routeParam in Db.Set<RouteParam>() on menuItemRouteValue.RouteParamId equals routeParam.Id into
                                  //   tmpRouteParams
                                  //  from routeParam in tmpRouteParams.DefaultIfEmpty()
                                  where !filterHasValue ||
                                  (filterHasValue && realFilter.ParentId == menuItem.ParentId &&
                                   (!menuItemRelation.UserId.HasValue || menuItemRelation.UserId == realFilter.UserId) &&
                                   (string.IsNullOrEmpty(parentFilter.MenuItemGroup) ||
                                    (!string.IsNullOrEmpty(parentFilter.MenuItemGroup) &&
                                     menuItemRelationGroup.Name == parentFilter.MenuItemGroup))) &&
                                  menuItem.IsActive
                                  select new { menuItemRelation, menuItem, routeName });
            var menuItemRelationsQuery = from menuItemRouteValue in Db.Set <MenuItemRelationRouteValue>()
                                         join routeParam in Db.Set <RouteParam>() on menuItemRouteValue.RouteParamId equals routeParam.Id
                                         select new
            {
                routeParam,
                menuItemRouteValue
            };



            var query2 = from q in query

                         join menuItemRouteValue in menuItemRelationsQuery
                         on q.menuItemRelation.Id equals menuItemRouteValue.menuItemRouteValue.MenuItemRelationId into tmprelationRouteValues
                         from menuItemRouteValue in tmprelationRouteValues.DefaultIfEmpty()
                         select new { q.routeName, q.menuItem, menuItemRouteValue };
            var query3 = (from q in query2


                          group new { q.menuItemRouteValue, q.menuItem, q.routeName } by
                          new
            {
                q.menuItem.Id,
                q.menuItem.ParentId,
                MenuItemName = q.menuItem.Name,
                RouteName = q.routeName.Name,
                SortOrder = q.menuItem.SortOrder
            }
                          into tmp
                          select new RouteQueryResult
            {
                Id = tmp.Key.Id,
                Name = tmp.Key.MenuItemName,
                RouteName = tmp.Key.RouteName,
                RouteParams =
                    tmp.Where(it => it.menuItemRouteValue != null && it.menuItemRouteValue.routeParam != null && it.menuItemRouteValue.routeParam.Name != null).Select(it => new RouteParameterPair
                {
                    Name = it.menuItemRouteValue.routeParam.Name,
                    Value = it.menuItemRouteValue.menuItemRouteValue.Value
                }).Distinct(),
                // .Select(it => new {Key = it.routeParam.Name, Value = it.menuItemRouteValue.Value}),
                ParentId = tmp.Key.ParentId,
                // UserId = userId,
                SortOrder = tmp.Key.SortOrder
            }).OrderBy(it => it.SortOrder);

            return(query3);
            //var query = (from menuItemRelation in Db.Set<UserMenuItemRelation>()
            //        join menuItem in Db.Set<MenuItem>() on menuItemRelation.MenuItemId equals menuItem.Id
            //        join routeName in Db.Set<RouteName>() on menuItemRelation.RouteNameId equals routeName.Id
            //        join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuItemRelation.MenuItemRelationGroupId equals menuItemRelationGroup.Id

            //        join menuItemRouteValue in Db.Set<MenuItemRelationRouteValue>()
            //            on menuItemRelation.Id equals menuItemRouteValue.MenuItemRelationId into tmprelationRouteValues
            //        from menuItemRouteValue in tmprelationRouteValues.DefaultIfEmpty()
            //        join routeParam in Db.Set<RouteParam>() on menuItemRouteValue.RouteParamId equals routeParam.Id into
            //            tmpRouteParams
            //        from routeParam in tmpRouteParams.DefaultIfEmpty()
            //        where !filterHasValue ||
            //               (filterHasValue && realFilter.ParentId == menuItem.ParentId &&
            //                    (!menuItemRelation.UserId.HasValue || menuItemRelation.UserId == realFilter.UserId) &&
            //                    (string.IsNullOrEmpty(parentFilter.MenuItemGroup) || (!string.IsNullOrEmpty(parentFilter.MenuItemGroup) && menuItemRelationGroup.Name == parentFilter.MenuItemGroup))) &&
            //              menuItem.IsActive
            //        group new { menuItemRouteValue, menuItem, routeName, routeParam } by
            //            new
            //            {
            //                menuItem.Id,
            //                menuItem.ParentId,
            //                MenuItemName = menuItem.Name,
            //                RouteName = routeName.Name,
            //                SortOrder = menuItem.SortOrder
            //            }
            //    into tmp
            //        select new RouteQueryResult
            //        {
            //            Id = tmp.Key.Id,
            //            Name = tmp.Key.MenuItemName,
            //            RouteName = tmp.Key.RouteName,
            //            RouteParams =
            //                tmp.Where(it => it.routeParam != null && it.routeParam.Name != null).Select(it => new RouteParameterPair
            //                {
            //                    Name = it.routeParam.Name,
            //                    Value = it.menuItemRouteValue.Value
            //                }).Distinct(),
            //            // .Select(it => new {Key = it.routeParam.Name, Value = it.menuItemRouteValue.Value}),
            //            ParentId = tmp.Key.ParentId,
            //            // UserId = userId,
            //            SortOrder = tmp.Key.SortOrder
            //        }).OrderBy(it => it.SortOrder);
            //return query;
            //.ToDictionary(it => it.routeParam.Name, it => it.menuItemRouteValue.Value)
        }
 public Task <List <RouteMenuItem> > GetSubMenusAsync(MenuParentFilter <int?, string> parentFilter)
 {
     return(Task <List <RouteMenuItem> > .Factory.StartNew(() => GetSubMenus(parentFilter)));
 }
 public Task <IEnumerable <RouteMenuItem> > GetMenuItemsAsync(MenuParentFilter <int?, string> parentFilter)
 {
     return(Task <IEnumerable <RouteMenuItem> > .Factory.StartNew(() => GetMenuItems(parentFilter)));
 }