Frage

In meiner Anwendung kann ein Unternehmen viele Mitarbeiter hat und jeder Mitarbeiter hat mehr E-Mail-Adressen haben kann.

Das Datenbankschema bezieht sich die Tabellen wie folgt aus:

Unternehmen -> CompanyEmployeeXref -> Mitarbeiter -> EmployeeAddressXref -> E-Mail

ich Entity Framework verwende und ich möchte eine LINQ-Abfrage erstellen, die den Namen der Firma zurückgibt und eine durch Kommata getrennte Liste von seinen Mitarbeiter die E-Mail-Adressen. Hier ist die Abfrage Ich versuche:


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"

...

Ich weiß, dass dieser Code falsch ist, ich glaube, ich bin durch eine Gruppe fehlt, aber es zeigt den Punkt. Ich bin der Syntax nicht sicher. Ist das überhaupt möglich? Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Hier ist nun gelöst ich das 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())
                }
        )


Andere Tipps

Es ist eigentlich ziemlich schwierig, dies in reiner Linq to SQL zu tun (oder Entity Framework, je nachdem, welche Sie verwenden), da SQL Server selbst keinen Aggregat Operator hat, die ein Komma getrennte Liste erzeugen kann, so dass es nicht hat Weg, um diese gesamte Anweisung in einer einzigen Abfrage zu transformieren. Ich könnte Sie eine „single-Anweisung“ Linq to SQL Antwort, aber es geht eigentlich nicht, dass Ihnen eine sehr gute Leistung zu geben, und ich bin nicht sicher, ob es überhaupt in EF funktionieren würde.

Es ist hässlicher, aber noch besser, wenn Sie tun nur eine regelmäßige beitreten, die Ergebnisse materialisieren, dann tun Sie Ihre Verkettung mit 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)
    };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top