Entity framework C#实体框架如何基于条件包含

Entity framework C#实体框架如何基于条件包含,entity-framework,c#-4.0,Entity Framework,C# 4.0,我有一张一对多对多的桌子 许多表格: 菜单组 menuid groupid 1 4 1 5 菜单 团体 群组用户 groupid userid 4 101 4 103 5 102 我想获得用户101的所有菜单 即 但是,即使编写了正确的连接查询,我还是得到了错误的输出。谁能帮我一下我做错了什么 Menuid groupid name 1 4 group4 1 5

我有一张一对多对多的桌子 许多表格:

菜单组

menuid  groupid
1       4
1       5
菜单

团体

群组用户

groupid     userid
4           101
4           103
5           102
我想获得用户101的所有菜单 即

但是,即使编写了正确的连接查询,我还是得到了错误的输出。谁能帮我一下我做错了什么

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

}

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

非常感谢。这将带回此用户的所有groupid和menuid。groupid和menuid都是用户的名称。我找不到任何属于其他用户的groupid。奇怪的是,最终的结果会带来其他groupid。那么你的意思是建议的答案也不起作用吗?你的意思是:从上下文中的m开始。菜单在上下文中加入mg。m.MenuId上的GroupMenu等于mg.MenuId在上下文中加入gu。GroupUsers。其中(gu=>gu.UserId==dbUser.UserId)在mg.GroupId=gu.GroupId上,其中gu.UserId==dbUser.UserId&&m.Customer.ExternalId==user.organizationId选择mNo。它不起作用。它将带回所有与menuI相关的组。这些组已编辑了答案,以完全按照您的要求返回结果,您是否可以尝试此操作并让我知道这是否解决了您的问题。因此,添加
where gu.GroupId=1
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));