我试图学习EF Core并打了这个墙,因为我对LINQ也是一个新手
我试图从一家公司获得所有不同的用户;
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
我将如何构建此查询? (没有包括)
return await context.Companies
.Include(g => g.Groups)
.ThenInclude(au => au.AppUsers)
.ThenInclude(u => u.AppUser)
.SingleOrDefaultAsync(x => x.Id == id);
*另外,我不确定数据库模型,我试图避免使用循环引用,但我认为我应该将用户与公司而不是群组联系起来,你怎么看?
答案 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();