Question

Dans ma demande, une entreprise peut avoir de nombreux employés et chaque employé peut avoir plusieurs adresses e-mail.

Le schéma de base de données concerne les tables comme ceci:

Entreprise -> CompanyEmployeeXref -> Employé -> EmployeeAddressXref -> E-mail

J'utilise Entity Framework et je veux créer une requête LINQ qui renvoie le nom de la société et une liste séparée par des virgules des adresses e-mail de l'employé de lui. Voici la requête que je tente:


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"

...

Je sais que ce code est erroné, je pense que je manque un groupe par, mais il illustre le point. Je ne suis pas sûr de la syntaxe. Est-ce seulement possible? Merci pour toute aide.

Était-ce utile?

La solution

Voici ce que je maintenant résolu le problème:


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


Autres conseils

Il est en fait assez difficile de le faire dans LINQ pur à SQL (ou Entity Framework, quel que soit celui que vous utilisez) parce que SQL Server lui-même n'a pas un opérateur global qui peut produire une liste délimitée par des virgules, il n'a donc pas façon de transformer cette déclaration en toute une seule requête. Je pourrais vous donner une « seule instruction » LINQ to SQL réponse mais il est en fait ne va pas vous donner de très bonnes performances, et je ne suis pas sûr que cela fonctionnerait tout dans EF.

de plus laid, mais encore mieux si vous faites juste une jointure normale, concrétiser les résultats, puis faites votre concaténation en utilisant 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)
    };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top