按分组语句映射一对多关系

时间:2014-03-10 17:37:38

标签: c# .net linq dapper

有一个查询:

        const string query = @"
               select *
                 from [Users] u
            left join [UserRoles] ur
                   on [ur].[UserId] = [u].[UserId]
            left join [Roles] r
                   on [r].[RoleId] = [ur].[RoleId]
            left join [ExternalLogins] el
                   on [el].[UserId] = [u].[UserId];
        ";

这会映射到data变量,即下一个类型的Array

UserRoleLoginRow {
    Role = role,
    User = user,
    UserLoginInfoRow = userLogin
}

哪些输出数据应按User分组,然后映射到User实体:

public sealed class User : IUser<string>
{
    public ICollection<UserLoginInfo> UserLoginInfos;
    public ICollection<Role> Roles;
}

我可以使用此代码实现它:

var users = data.GroupBy(t => t.User, (key, value) => {
    key.Roles = new Collection<Role>(value.Select(v=>v.Role).ToList());

    return key;
});

但它看起来很乱,因为我必须自己创建集合,考虑转换和检查空引用(如果我从数据库中选择UserLoginInfoModel然后想将其映射到UserLoginInfo

是否有更清洁的方法来实现这一目标(以及另一种方式)?

0 个答案:

没有答案