2016-10-07 2 views
2

У меня есть таблица с одного до многих многих отношений, т.е. ManyToMany таблицы:C# Entityframework как включить на основе условия

MenuGroup

menuid groupid 
1  4 
1  5 

Меню

menuid name 
1  One 
2  Two 

Группа

groupid name 
4  group4 
5  group5 

Groupuser

groupid  userid 
4   101 
4   103 
5   102 

я хотел бы получить все меню пользователя 101 т.е.

Menuid groupid name 
1  4  group4 

Но я получаю неправильно из положить Eventhough писать правильно присоединиться запросы. Может ли кто-нибудь помочь, что я делаю неправильно здесь?

Menuid groupid name 
1  4  group4 
1  5  group5 

(from m in context.Menus 
     join mg in context.MenuGroup on m.MenuId equals mg.MenuId 
     join gu in context.Groupuser on mg.GroupId equals gu.GroupId 
     where gu.UserId == 101 
     select m); 

Я бы хотел включить только эту информацию о конкретном пользователе, хотя это меню находится в другой группе.

мой ожидаемый результат в формате JSON будет

{ 
    "menuid": 1, 
    "name": "One", 
    "groups":[ 
     { 
      "groupid":4, 
"name":"group4" 
     } 
    ] 

} 
+0

Так что добавьте 'где gu.GroupId = 1'? –

ответ

1

Ваш запрос LINQ выглядит хорошо, я подозреваю, что вопрос передачи данных, но вы хотели бы попробовать следующий запрос, чтобы увидеть, что вы получите обратно. Этот следующий запрос требует объявленных свойств навигации.

var userMenus = context.GroupUser.Where(u=>u.UserId = 101).SelectMany(g=>g.Group.Menus 
      .Select(m=> new {Menu=m.MenuId, GroupId=g.GroupId,GroupName=g.Group.name)) 
      .ToList(); 

В случае, если вы хотите полное меню объекта

var userMenus = context.GroupUser.Where(u=>u.UserId = 101).SelectMany(g=>g.Group.Menus 
      .Select(m=> new {Menu=m.Menu, GroupId=g.GroupId,GroupName=g.Group.name)) 
      .ToList(); 

В случае, если вы не заботитесь о столбцах группы и просто хочешь Меню затем

var userMenus = context.GroupUsers.Where(u => u.UserId == 101) 
       .SelectMany(g => g.Group.Menus.Select(m=>m.Menu)); 
+0

Спасибо. Это возвращает все groupid и menuid для этого пользователя. как groupid, так и menuid принадлежат пользователю. i dont find any groupid принадлежит другому пользователю. странно, что конечный результат приносит другую группу. –

+0

Итак, вы подразумеваете, что предложенный ответ тоже не работает.? – pjobs

+0

U означает следующее: от m в контексте. Menus join mg in context.GroupMenus on m.MenuId равно mg.MenuId присоединиться к gu в контексте. GroupUsers.Where (gu => gu.UserId == dbUser.UserId) on mg.GroupId равно gu.GroupId где gu.UserId == dbUser.UserId && m.Customer.ExternalId == user.OrganisationId select m –

Смежные вопросы