使用 LINQ GroupBy 为复杂的实体关系获取不同的结果

本文关键字:获取 结果 关系 实体 GroupBy 复杂 使用 LINQ | 更新日期: 2024-10-26 02:02:56

以下是我的人际关系的快速概述:

one Account has many AccountRoles
one AccountRole has many UserAccountRoles
many UserAccountRoles can have one User

我需要得到的是一个Account的所有User的集合。

如何在 LINQ 中执行此操作?

编辑:

这是我到目前为止尝试过的:

var dto = _context.Set<Model.Account>()
    .Find(account.Id);
if (dto == null)
    return null;
var userAccountRoleDTOs = dto.AccountRoles
    .Select(ar => ar.UserAccountRoles);
var userDTOs = userAccountRoleDTOs
    .Select(uar => uar.Select(uar2 => uar2.User));
return userDTOs;

userDTOsreturn收藏的集合。这对我来说没有多大意义。

使用 LINQ GroupBy 为复杂的实体关系获取不同的结果

由于最终你想要的只是一个用户的平展集合,因此你应该能够使用 SelectMany() 来平展一对多关系,然后在最后调用 Distinct()

var users = dto.AccountRoles
    .SelectMany(ar => ar.UserAccountRoles.Select(uar => uar.User))
    .Distinct();

或者,以查询形式

var users = (from ar in dto.AccountRoles
             from uar in ar.UserAccountRoles
             select uar.User)
            .Distinct();

或者你可以反过来:

from u in context.Users
where u.UserAccountRoles.Any(uar=>uar.AccountRole.Account.Id == someAccountId)