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