Domanda

Nella mia applicazione, una società può avere molti dipendenti e ogni dipendente può avere avere più indirizzi email.

Lo schema del database si riferisce alle tabelle in questo modo:

Azienda -> CompanyEmployeeXref -> Employee -> EmployeeAddressXref -> E-mail

Sto usando Entity Framework e voglio creare una query LINQ che restituisce il nome della società e un elenco separato da virgole di indirizzi e-mail di essa la dipendente. Ecco la domanda che sto cercando:


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"

...

So che questo codice è sbagliato, penso che mi manca un gruppo, ma illustra il punto. Non sono sicuro della sintassi. Questo è anche possibile? Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Ecco ora ho risolto il problema:


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


Altri suggerimenti

In realtà è piuttosto difficile fare questo in puro LINQ to SQL (o Entity Framework, una seconda di quale si sta utilizzando), perché in sé SQL Server non ha qualsiasi operatore di aggregazione in grado di produrre un elenco delimitato da virgole, in modo che non ha modo per trasformare questo intera istruzione in una singola query. Potrei dare un "single-statement" LINQ to SQL risposta, ma in realtà non è intenzione di darvi prestazioni molto buone, e non sono sicuro se avrebbe funzionato a tutti in EF.

E 'brutto, ma ancora meglio se lo farete un normale join, materializzano i risultati, quindi fare il vostro concatenazione utilizzando 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)
    };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top