C#Entityframework如何根据条件包含

时间:2016-10-07 14:38:24

标签: entity-framework c#-4.0

我有一对一对多关系的表,即 ManyToMany表:

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

但是我写了错误的输出,尽管写了正确的连接查询。谁能帮助我在这里做错了什么?

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"
        }
    ]

}

1 个答案:

答案 0 :(得分: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();

如果您需要完整的Menu对象

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));