public IList <RouteMenuItem> GetMenusByNavigation(Navigation navigationGeneric, int quantity = 5, bool onlyIsActive = true)
        {
            var paramQuery = (from entity in Db.Set <MenuItemRelationRouteValue>()
                              join routeParam in Db.Set <RouteParam>() on entity.RouteParamId equals routeParam.Id
                              group new { entity, routeParam }
                              by new { entity.MenuItemRelationId }
                              into tmp
                              select new
            {
                tmp.Key.MenuItemRelationId,
                RouteParams = tmp.ToDictionary(it => it.routeParam.Name, it => it.entity.Value)
            });

            if (navigationGeneric.RouteParameters != null && navigationGeneric.RouteParameters.Any())
            {
                paramQuery = navigationGeneric.RouteParameters.Aggregate(paramQuery, (current, item) => current.Where(it => it.RouteParams.Any(it2 => it2.Key == item.Key && it2.Value == (string)item.Value)));
                //    paramQuery = navigationGeneric.RouteParameters.Aggregate(paramQuery, (current, item) => current.Where(it => it.Value == (string)item.Value && it.RouteParam.Name == item.Key));
            }
            // var selectedMiQuery = paramQuery.Select(it => it.MenuItemRelationId).Distinct();
            var result = (from menuItem in Db.Set <MenuItem>()
                          join menuItemRelation in Db.Set <UserMenuItemRelation>() on menuItem.Id equals
                          menuItemRelation.MenuItemId
                          //join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId equals menuItemRelationGroup.Id

                          join routeName in Db.Set <RouteName>() on menuItemRelation.RouteNameId equals routeName.Id
                          join routeParam in paramQuery on menuItemRelation.Id equals routeParam.MenuItemRelationId
                          where navigationGeneric.RouteName == routeName.Name
                          select new RouteMenuItem
            {
                Id = menuItem.Id,
                RouteName = routeName.Name,
                ParentId = menuItem.ParentId,
                Name = menuItem.Name,
                UserId = menuItemRelation.UserId,
                RouteParams = routeParam.RouteParams
            });

            return(result.ToList());
        }
 public Task <IList <RouteMenuItem> > GetMenusByNavigationAsync(Navigation navigationGeneric, int quantity = 5, bool onlyIsActive = true)
 {
     return
         (Task <IList <RouteMenuItem> > .Factory.StartNew(
              () => GetMenusByNavigation(navigationGeneric, quantity, onlyIsActive)));
 }
        public IList <RouteMenuItem> GetMenusByNavigation(Navigation navigationGeneric, int quantity = 5, bool onlyIsActive = true)
        {
            try
            {
                var paramQuery = (from entity in Db.Set <MenuItemRelationRouteValue>()
                                  join routeParam in Db.Set <RouteParam>() on entity.RouteParamId equals routeParam.Id
                                  group new { entity, routeParam }
                                  by new { entity.MenuItemRelationId }
                                  into tmp
                                  select new
                {
                    tmp.Key.MenuItemRelationId,
                    RouteParams = tmp.ToDictionary(it => it.routeParam.Name, it => it.entity.Value)
                });
                if (navigationGeneric.RouteParameters != null && navigationGeneric.RouteParameters.Any())
                {
                    paramQuery = navigationGeneric.RouteParameters.Aggregate(paramQuery, (current, item) => current.Where(it => it.RouteParams.Any(it2 => it2.Key == item.Key && it2.Value == (string)item.Value)));
                    //    paramQuery = navigationGeneric.RouteParameters.Aggregate(paramQuery, (current, item) => current.Where(it => it.Value == (string)item.Value && it.RouteParam.Name == item.Key));
                }
                // var selectedMiQuery = paramQuery.Select(it => it.MenuItemRelationId).Distinct();
                var result = (from menuItem in Db.Set <MenuItem>()
                              join menuItemRelation in Db.Set <RoleMenuItemRelation>() on menuItem.Id equals
                              menuItemRelation.MenuItemId
                              //join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId equals menuItemRelationGroup.Id

                              join routeName in Db.Set <RouteName>() on menuItemRelation.RouteNameId equals routeName.Id
                              join routeParam in paramQuery on menuItemRelation.Id equals routeParam.MenuItemRelationId
                              where navigationGeneric.RouteName == routeName.Name
                              select new RouteMenuItem
                {
                    Id = menuItem.Id,
                    RouteName = routeName.Name,
                    ParentId = menuItem.ParentId,
                    Name = menuItem.Name,
                    RoleId = menuItemRelation.RoleId,
                    RouteParams = routeParam.RouteParams
                });

                return(result.ToList());

                //return result;
                //var query = (from menuItem in Db.Set<MenuItem>()
                //             join menuItemRelation in Db.Set<RoleMenuItemRelation>() on menuItem.Id equals
                //                 menuItemRelation.MenuItemId
                //             //join menuItemRelationGroup in Db.Set<MenuItemRelationGroup>() on menuRelation.MenuItemRelationGroupId equals menuItemRelationGroup.Id
                //             join routeName in Db.Set<RouteName>() on menuItemRelation.RouteNameId equals routeName.Id
                //             where navigationGeneric.RouteName == routeName.Name
                //             select new
                //             {
                //                 MenuItemId = menuItem.Id,
                //                 MenuItemName = menuItem.Name,
                //                 RouteName = routeName.Name,
                //                 MenuItemRelationId = menuItemRelation.Id,
                //                 menuItemRelation.RoleId,
                //                 ParentId = menuItem.ParentId
                //             }).Distinct();
                //if (navigationGeneric.RouteParameters != null && navigationGeneric.RouteParameters.Any())
                //{
                //    query = (from item in query
                //             join entity in Db.Set<MenuItemRelationRouteValue>() on item.MenuItemRelationId equals
                //                 entity.MenuItemRelationId
                //             join routeParam in Db.Set<RouteParam>() on entity.RouteParamId equals routeParam.Id
                //             group new
                //             {
                //                 item.MenuItemId,
                //                 item.MenuItemName,
                //                 item.MenuItemRelationId,
                //                 item.ParentId,
                //                 item.RouteName,
                //                 item.RoleId,
                //                 entity,
                //                 routeParam
                //             } by
                //             new
                //             {
                //                 item.MenuItemId,
                //                 item.MenuItemName,
                //                 item.MenuItemRelationId,
                //                 item.ParentId,
                //                 item.RouteName,
                //                 item.RoleId
                //             } into tmp
                //             select new RouteMenuItem
                //             {
                //                 Id = tmp.Key.MenuItemId,
                //                 RouteName = tmp.Key.RouteName,
                //                 ParentId = tmp.Key.ParentId,
                //                 Name = tmp.Key.MenuItemName,
                //                 RoleId = tmp.Key.RoleId,

                //                 RouteParams = navigationGeneric.RouteParameters.Aggregate(tmp.ToDictionary(it=>it.entity.Value,it=>it.routeParam.Name), (current, routeParameter) => current.Where(it => it.Key == routeParameter.Key && it.Value == routeParameter.Value));
                //             });
                //}

                //var res = new List<RouteMenuItem>();
                // foreach (var item in query)
                // {
                //     var q = (from entity in Db.Set<MenuItemRelationRouteValue>()
                //         join routeParam in Db.Set<RouteParam>() on entity.RouteParamId equals routeParam.Id
                //         where entity.MenuItemRelationId == item.MenuItemRelationId
                //         select new {Key = routeParam.Name, Value = entity.Value});
                //     //if (q.Any())
                //     //{
                //     //    q = navigationGeneric.RouteParameters.Aggregate(q, (current, routeParameter) => current.Where(it => it.Key == routeParameter.Key && it.Value == routeParameter.Value));
                //     //}

                //     res.Add(new RouteMenuItem
                //     {
                //         Id = item.MenuItemId,
                //         RouteName = item.RouteName,
                //         ParentId = item.ParentId,
                //         Name = item.MenuItemName,
                //         RoleId = item.RoleId,
                //         RouteParams = q.Any() ? q.ToDictionary(it2 => it2.Key, it2 => it2.Value) : null// routeQ.Where(it=>it.MenuItemRelationId ==item.MenuItemRelationId).ToDictionary(it2 => it2.Key, it2 => it2.Value)
                //     });
                // }
                // return res;
                //group new
                //{
                //    menuItem,
                //    routeName,
                //    menuItemRelation.RoleId,
                //    tmpQ
                //} by
                // new
                // {
                //     MenuItemId = menuItem.Id,
                //     MenuItemName = menuItem.Name,
                //     RouteName = routeName.Name,
                //     menuItemRelation.RoleId,
                //     ParentId = menuItem.ParentId
                // } into tmp
                //select new RouteMenuItem
                //{
                //    Id = tmp.Key.MenuItemId,
                //    RouteName = tmp.Key.RouteName,
                //    ParentId = tmp.Key.ParentId,
                //    Name = tmp.Key.MenuItemName,
                //    RoleId = tmp.Key.RoleId,

                //    RouteParams = tmp.Where(it=>it.).ToDictionary(it2 => it2.Key, it2 => it2.Value)
                //});


                //query = navigationGeneric.RouteParameters.Aggregate(query,
                //    (current, routeParam) =>
                //        current.Where(
                //            it =>
                //                it.RouteParams != null &&
                //                it.RouteParams.Any(it2 => it2.Key == routeParam.Key && it2.Value == routeParam.Value)));

                //var result = query.AsEnumerable().Select(it => new RouteMenuItem
                //{
                //    Id = it.menuItem.Id,
                //    RouteName = it.routeName.Name,
                //    ParentId = it.menuItem.ParentId,
                //    Name = it.menuItem.Name,
                //    RoleId = it.RoleId,

                //    RouteParams = it.tmpQ.ToDictionary(it2 => it2.Key, it2 => it2.Value)
                //}).ToList();
                //return result;
            }
            catch (Exception ex)
            {
                LogEventManager.Logger.Error(ex.Message, ex);
                throw;
            }
        }