Linq запрашивают с подзапросом как разделенные от запятой значения

В моем приложении компания может иметь многих сотрудников, и каждый сотрудник может иметь, имеют несколько адресов электронной почты.

Схема базы данных связывает таблицы как это:

Компания-> CompanyEmployeeXref-> Сотрудник-> EmployeeAddressXref-> электронная почта

Я использую Платформу Объекта, и я хочу создать запрос LINQ, который возвращает название компании и разделенный запятыми список, он - адреса электронной почты сотрудника. Вот запрос, которого я делаю попытку:


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.Aggregate(x=>x + ",")
           }


Desired Output:

"Company1", "a@company1.com,b@company1.com,c@company1.com"

"Company2", "a@company2.com,b@company2.com,c@company2.com"

...

Я знаю, что этот код является неверным, я думаю, что скучаю по группе, но он иллюстрирует тезис. Я не уверен в синтаксисе. Это даже возможно? Спасибо за любую справку.

6
задан Keith 18 May 2010 в 21:15
поделиться

2 ответа

Вот как я решил проблему:


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())
                }
        )


7
ответ дан 9 December 2019 в 20:40
поделиться

На самом деле это довольно сложно сделать в чистом Linq to SQL (или Entity Framework, какую бы вы ни использовали), потому что в самом SQL Server нет оператора агрегирования, который может выдавать запятую. список с разделителями, поэтому у него нет возможности преобразовать весь этот оператор в один запрос. Я мог бы дать вам ответ Linq to SQL «с одним оператором», но на самом деле он не даст вам очень хорошей производительности, и я не уверен, будет ли он вообще работать в EF.

Это уродливо, но все же лучше, если вы просто выполните обычное соединение, материализуете результаты, а затем выполните конкатенацию с помощью 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)
    };
5
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: