.net 具有多个表的Linq GroupJoin

.net 具有多个表的Linq GroupJoin,.net,linq,.net-core,.net,Linq,.net Core,我必须遵循Linq查询来获取用户并添加UserClaimCollection public async Task<List<User>> GetCollection() { List<User> result = _identityContext.Users .GroupJoin( _identityContext.UserClaims, u => u.Id,

我必须遵循Linq查询来获取用户并添加UserClaimCollection

public async Task<List<User>> GetCollection()
{
    List<User> result = _identityContext.Users
        .GroupJoin(
            _identityContext.UserClaims,
            u => u.Id,
            uc => uc.UserId,
            (u, uc) => new { user = u, claims = uc })
        .ToList()
        .Select(u => new User(
            new Guid(u.user.Id),
            u.user.UserName,
            u.user.FirstName,
            u.user.LastName,
            u.user.Email,
            new UserClaimCollection(
                u.claims.Select(uc => new UserClaim(uc.ClaimType, uc.ClaimValue)).ToList()
            ))
        ).ToList();

    return result;
}
公共异步任务GetCollection() { 列表结果=_identityContext.Users .GroupJoin( _identityContext.UserClaims, u=>u.Id, uc=>uc.UserId, (u,uc)=>new{user=u,claims=uc}) 托利斯先生() .选择(u=>新用户( 新Guid(u.user.Id), u、 user.UserName, u、 user.FirstName, u、 user.LastName, u、 用户邮箱, 新UserClaimCollection( u、 claims.Select(uc=>newuserclaim(uc.ClaimType,uc.ClaimValue)).ToList() )) ).ToList(); 返回结果; } 如何将第二个GroupJoin添加到此选择以添加角色集合

e、 g

公共异步任务GetCollection() { 列表结果=_identityContext.Users .GroupJoin( _identityContext.UserClaims, u=>u.Id, uc=>uc.UserId, (u,uc)=>new{user=u,claims=uc}) .GroupJoin( _identityContext.UserRoles, u=>u.Id, ur=>ur.UserId, (u,ur)=>new{user=u,roles=ur}) 托利斯先生() .选择(u=>新用户( 新Guid(u.user.Id), u、 user.UserName, u、 user.FirstName, u、 user.LastName, u、 用户邮箱, 新UserClaimCollection( u、 claims.Select(uc=>newuserclaim(uc.ClaimType,uc.ClaimValue)).ToList() )), 新用户角色集合( u、 roles.Select(ur=>newuserrole(ur.RoleType,ur.RoleValue)).ToList() )) ).ToList(); 返回结果; }
您需要记住第一个
GroupJoin
的输出是您的新匿名类,因此您需要记住这是传递到第二个
GroupJoin
的内容。我建议命名lambda参数以提醒您这一点

List<User> result = _identityContext.Users
    .GroupJoin(
        _identityContext.UserClaims,
        u => u.Id,
        c => c.UserId,
        (user, claims) => new { user, claims })
    .GroupJoin(
        _identityContext.UserRoles,
        uc => uc.user.Id,
        roles => roles.UserId,
        (uc, roles) => new { uc.user, uc.claims, roles })                    
    .ToList()
    .Select(ucr => new User(
        new Guid(ucr.user.Id),
        ucr.user.UserName,
        ucr.user.FirstName,
        ucr.user.LastName,
        ucr.user.Email,
        new UserClaimCollection(
            ucr.claims.Select(c => new UserClaim(c.ClaimType, c.ClaimValue)).ToList()
        )),
        new UserRoleCollection(
            ucr.roles.Select(r => new UserRole(r.RoleType, r.RoleValue)).ToList()
        ))
    ).ToList();
List result=\u identityContext.Users
.GroupJoin(
_identityContext.UserClaims,
u=>u.Id,
c=>c.UserId,
(用户,声明)=>新{用户,声明})
.GroupJoin(
_identityContext.UserRoles,
uc=>uc.user.Id,
roles=>roles.UserId,
(uc,roles)=>new{uc.user,uc.claims,roles})
托利斯先生()
.选择(ucr=>新用户(
新Guid(ucr.user.Id),
ucr.user.UserName,
ucr.user.FirstName,
ucr.user.LastName,
ucr.user.Email,
新UserClaimCollection(
选择(c=>newuserclaim(c.ClaimType,c.ClaimValue)).ToList()
)),
新用户角色集合(
选择(r=>newuserrole(r.RoleType,r.RoleValue)).ToList()
))
).ToList();

第二个
GroupJoin
中应该有
u=>u.user.Id
。记住第一个
GroupJoin
的输出是什么。您应该拥有包含所有的输出。
List<User> result = _identityContext.Users
    .GroupJoin(
        _identityContext.UserClaims,
        u => u.Id,
        c => c.UserId,
        (user, claims) => new { user, claims })
    .GroupJoin(
        _identityContext.UserRoles,
        uc => uc.user.Id,
        roles => roles.UserId,
        (uc, roles) => new { uc.user, uc.claims, roles })                    
    .ToList()
    .Select(ucr => new User(
        new Guid(ucr.user.Id),
        ucr.user.UserName,
        ucr.user.FirstName,
        ucr.user.LastName,
        ucr.user.Email,
        new UserClaimCollection(
            ucr.claims.Select(c => new UserClaim(c.ClaimType, c.ClaimValue)).ToList()
        )),
        new UserRoleCollection(
            ucr.roles.Select(r => new UserRole(r.RoleType, r.RoleValue)).ToList()
        ))
    ).ToList();