EF核心选择具有多对多关系的独特孙子

时间:2018-04-17 17:12:09

标签: entity-framework linq model entity-framework-core

我试图学习EF Core并打了这个墙,因为我对LINQ也是一个新手

考虑模型: enter image description here

我试图从一家公司获得所有不同的用户;

SQL语句将是这样的:

SELECT DISTINCT gau.AppUserId, au.Name, au.Id FROM Companies c 
INNER JOIN Groups g ON g.CompanyId = c.Id
INNER JOIN GroupAppUsers gau ON gau.GroupId = g.Id
INNER JOIN AppUsers au ON gau.AppUserId = au.Id
Where c.Id = 40

结果: enter image description here

我将如何构建此查询? (没有包括)

            return await context.Companies
            .Include(g => g.Groups)
                .ThenInclude(au => au.AppUsers)
                    .ThenInclude(u => u.AppUser)
            .SingleOrDefaultAsync(x => x.Id == id);

*另外,我不确定数据库模型,我试图避免使用循环引用,但我认为我应该将用户与公司而不是群组联系起来,你怎么看?

3 个答案:

答案 0 :(得分:3)

  

我试图从一家公司获得所有不同的用户

您可以简单地从用户开始并应用基于Disctinct的条件,而不是从公司开始并导航到用户,从而使用户因多对多关系而倍增,然后应用Any运算符,因此根本不需要Disctinct

这样的事情(DbSet /导航属性名称可能不同):

var companyUsers = await context.Users
    .Where(u => u.UserGroups.Any(ug => ug.Group.Company.Id == id))
    .ToListAsync();

答案 1 :(得分:0)

假设您的链接表(GroupAppUser)未建模为实体,例如:

var q = from c in db.Companies
        from g in c.Groups
        from u in g.AppUsers
        select u;

或以Lambda形式:

var q = db.Companies
          .SelectMany(c => c.Groups)
          .SelectMany(g => g.AppUsers);

答案 2 :(得分:0)

获得单个Companies对象后,可以使用“导航”属性获取AppUser个对象:

return await context.Companies
                    .Include(g => g.Groups)
                    .ThenInclude(au => au.AppUsers)
                    .ThenInclude(u => u.AppUser)
                    .SingleOrDefaultAsync(x => x.Id == id)
                    .Groups.AppUsers.Distinct();
相关问题