Entity framework 用于连接多个表并在单行中获取逗号分隔值的LINQ查询

Entity framework 用于连接多个表并在单行中获取逗号分隔值的LINQ查询,entity-framework,linq,Entity Framework,Linq,我在下面的表格中列出了这些值 账户: 身份证件 名称 电子邮件 101 纳西尔乌丁 nasir@email.com 我终于找到了答案。结果可以通过不同的方式实现。举例如下: var answer1 = (from account in userAccounts join accountRole in accountRoles on account.Id equals accountRole.AccountId join role in roles on accountRole.R

我在下面的表格中列出了这些值

账户:

身份证件 名称 电子邮件 101 纳西尔乌丁 nasir@email.com
我终于找到了答案。结果可以通过不同的方式实现。举例如下:

var answer1 = (from account in userAccounts
    join accountRole in accountRoles on account.Id equals accountRole.AccountId
    join role in roles on accountRole.RoleId equals role.Id
    select new UserAccount
    {
        AccountId = account.Id,
        Name = account.Name,
        Email = account.Email,
        Roles = role.Title
    }).ToList().GroupBy(x => new { x.AccountId, x.Name, x.Email }).Select(y => new UserAccount
    {
        AccountId = y.Key.AccountId,
        Name = y.Key.Name,
        Email = y.Key.Email,
        Roles = string.Join(", ", y.Select(a => a.Roles))
    }).ToList();
----------------------------------------------------------------------------
var answer2 = (from account in userAccounts
     join accountRole in accountRoles on account.Id equals accountRole.AccountId
     join role in roles on accountRole.RoleId equals role.Id
     group new { account, role } by new { account.Id, account.Name, account.Email } into ag
     select new UserAccount
     {
         AccountId = ag.Key.Id,
         Name = ag.Key.Name,
         Email = ag.Key.Email,
         Roles = string.Join(", ", ag.Select(x=> x.role.Title))
     }).ToList();
    ----------------------------------------------------------------------------

var answer3 = (from account in userAccounts
     let roles1 = from accountRole in accountRoles
                  join role in roles on accountRole.RoleId equals role.Id
                  where accountRole.AccountId == account.Id
                  select role
     select new UserAccount
     {
         AccountId = account.Id,
         Name = account.Name,
         Email = account.Email,
         Roles = string.Join(", ", roles1.Select(x => x.Title))
     }).ToList();

我终于找到了答案。结果可以通过不同的方式实现。举例如下:

var answer1 = (from account in userAccounts
    join accountRole in accountRoles on account.Id equals accountRole.AccountId
    join role in roles on accountRole.RoleId equals role.Id
    select new UserAccount
    {
        AccountId = account.Id,
        Name = account.Name,
        Email = account.Email,
        Roles = role.Title
    }).ToList().GroupBy(x => new { x.AccountId, x.Name, x.Email }).Select(y => new UserAccount
    {
        AccountId = y.Key.AccountId,
        Name = y.Key.Name,
        Email = y.Key.Email,
        Roles = string.Join(", ", y.Select(a => a.Roles))
    }).ToList();
----------------------------------------------------------------------------
var answer2 = (from account in userAccounts
     join accountRole in accountRoles on account.Id equals accountRole.AccountId
     join role in roles on accountRole.RoleId equals role.Id
     group new { account, role } by new { account.Id, account.Name, account.Email } into ag
     select new UserAccount
     {
         AccountId = ag.Key.Id,
         Name = ag.Key.Name,
         Email = ag.Key.Email,
         Roles = string.Join(", ", ag.Select(x=> x.role.Title))
     }).ToList();
    ----------------------------------------------------------------------------

var answer3 = (from account in userAccounts
     let roles1 = from accountRole in accountRoles
                  join role in roles on accountRole.RoleId equals role.Id
                  where accountRole.AccountId == account.Id
                  select role
     select new UserAccount
     {
         AccountId = account.Id,
         Name = account.Name,
         Email = account.Email,
         Roles = string.Join(", ", roles1.Select(x => x.Title))
     }).ToList();

下面根据您的帖子中提供的信息(以及一些假设,因为我在您的任何表中都找不到,例如,
UserFullName
),使用Lambda表达式(不是查询表达式)给出了预期结果

注意:我也相信有一种更有效的方法可以做到这一点,但如果没有其他方法的话,这是一个起点

(以下是正在使用的.NET小提琴:):

这将产生以下输出:


下面根据您的帖子中提供的信息(以及一些假设,因为我在您的任何表中都找不到,例如,
UserFullName
),使用Lambda表达式(不是查询表达式)给出了预期结果

注意:我也相信有一种更有效的方法可以做到这一点,但如果没有其他方法的话,这是一个起点

(以下是正在使用的.NET小提琴:):

这将产生以下输出:


您得到了什么结果?您使用的是实体框架吗?这看起来不像典型的EF查询。EF通常会在UserAccount类中创建AccountRole属性,在AccountRole类中在后台创建Role属性,这样就不需要在查询中使用aexplicit联接。请检查更改的代码您是先使用代码还是先使用数据库?请显示帐户类定义。您得到了什么结果?您使用的是实体框架吗?这看起来不像典型的EF查询。EF通常会在UserAccount类中创建AccountRole属性,在AccountRole类中在后台创建Role属性,这样就不需要在查询中使用aexplicit联接。请检查更改的代码您是先使用代码还是先使用数据库?请显示帐户类定义。谢谢回答。谢谢回答。我很高兴看到这个关于如何使用查询表达式(多种方式)实现的答案。这将是将来如何在Lambda上使用查询表达式的一个很好的参考。非常感谢。我很高兴看到这个关于如何使用查询表达式(多种方式)实现的答案。这将是将来如何在Lambda上使用查询表达式的一个很好的参考。非常感谢。