Linq query with subquery as comma-separated values

后端 未结 2 787
無奈伤痛
無奈伤痛 2021-01-05 15:32

In my application, a company can have many employees and each employee may have have multiple email addresses.

The database schema relates the tables like this:

相关标签:
2条回答
  • 2021-01-05 16:15

    Here's now I solved the problem:

    
    from c in Company
    join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
    join e in Employee on ex.EmployeeId equals e.Id
    join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
    join a in Address on ax.AddressId equals a.Id
    group a.Email by new {c.Name} into g
    select new {
                    Company=g.Key.Name,
                    Email=g.Select(e=>e).Distinct()
                }
    ).ToList()
    .Select(l=> 
               new {
                        l.Name,
                        Email=string.Join(",", l.Email.ToArray())
                    }
            )
    
    
    
    0 讨论(0)
  • 2021-01-05 16:29

    It's actually rather difficult to do this in pure Linq to SQL (or Entity Framework, whichever one you're using) because SQL Server itself doesn't have any aggregate operator that can produce a comma delimited list, so it has no way to transform this entire statement into a single query. I could give you a "single-statement" Linq to SQL answer but it's actually not going to give you very good performance, and I'm not sure if it would work at all in EF.

    It's uglier but still better if you just do a regular join, materialize the results, then do your concatenation using Linq to Objects:

    var rows =
        (from c in Company
         join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
         join e in Employee on ex.EmployeeId equals e.Id
         join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
         join a in Address on ax.AddressId equals a.Id
         select new 
         {
             c.Name,
             a.Email
         }).AsEnumerable();
    
    var emails =
        from r in rows
        group r by r.Name into g
        select new
        {
            Name = g.Key,
            Emails = g.Aggregate((x, y) => x + "," + y)
        };
    
    0 讨论(0)
提交回复
热议问题