2010-10-18 6 views
10

Ich kämpfe mit Linq versucht, die Syntax zu lernen, und ich kann nicht herausfinden, wie die folgende einfache Abfrage drehteinfache SQL-Abfrage zu Linq mit Gruppe und Aggregatfunktionen

SELECT DISTINCT 
    user.firstname, 
    user.lastname, 
    COUNT(invoice.amount), 
    SUM(invoice.amount) 
FROM 
    company_user 
    INNER JOIN 
     user 
    ON 
     company_user.user_id = user.user_id 
    INNER JOIN 
     invoice 
    ON 
     invoice.user_id= invoice.user_id 
WHERE 
    company_user.company_id = 1 
GROUP BY 
    user.firstname, 
    user.lastname, 
GO 

Jede Hilfe, dies zu tun in linq wäre großartig.

Antwort

15

Die Abfrage sind Sie nach sollte ziemlich nahe sein:

var query = 
    from cu in company_user 
    where cu.company_id == 1 
    join u in user on cu.user_id equals u.user_id 
    join i in invoice on u.user_id equals i.user_id 
    group i.amount by new 
    { 
     u.firstname, 
     u.lastname, 
    } into gs 
    select new 
    { 
     firstname = gs.Key.firstname, 
     lastname = gs.Key.lastname, 
     count = gs.Count(), 
     sum = gs.Sum(), 
    }; 

Viel Spaß!

+1

Danke. Ich hatte schon eine Weile damit zu kämpfen, da ich nicht herausfinden konnte, wie ich die Gruppe durchbringen und in Rechnung stellen konnte. Aber es scheint mir den Trick zu schaffen, zumindest während LinqPad funktioniert – cdmdotnet

0

hey diese Seite können Sie helfen:

101 Linq Samples

Beispiele für die meisten der Linq-Funktionen hat, wenn u ausrechnen nicht, kann ich für Sie später schreiben, wenn jemand nicht tut.

+0

Ja, ich sah, dass Anblick, verwirrte die Hölle aus mir heraus und schien mehr Verwirrung zu stiften als Antworten. Trotzdem danke. – cdmdotnet

0

Ich denke, Sie haben eine Diskrepanz in Ihrer Join-Klausel - Sie sind innerlich Rechnung bei sich auf Benutzer-ID beitreten. Ich nehme an, dass Sie beabsichtigten, dies dem Benutzer beizutreten?

In jedem Fall ist hier mein bester Schuss:

from inv in invoices 
group inv by new { inv.user_id } into userInv 
join usr in users on userInv.Key.user_id equals usr.user_id 
where usr.company_user.company_id = 1 
select new 
{ 
    usr.firstname, 
    usr.lastname, 
    amount = inv.Count(), 
    sum = inv.Sum(amt => amt.amount) 
} 

Wie für LINQ Vorschläge, würde ich vorschlagen, dass Sie auf jeden Fall herunterladen und mit LINQPad rumspielen. Ich benutze es die ganze Zeit, um LINQ-Anweisungen ohne Visual Studio zu testen. Es wird auch Ihre LINQ-Anweisungen in SQL konvertieren, was wahrscheinlich von besonderem Interesse für Sie ist.

Bearbeiten: Enigmativity Aussage ist viel näher an was Sie angefordert haben, als meins ist. Ich war in den Beispielen, mit denen ich arbeitete, nicht auf die Spaltengruppierung gestoßen.

4

Seit op Syntax erwähnt Lernen, hier ist eine fließend Version:

company_user 
    .Where(x => x.company_id == 1) 
    .Join(
     user, 
     x => x.user_id, 
     x => x.user_id, 
     (o,i) => new { 
      FirstName = i.firstName, 
      LastName = i.lastName, 
      InvoiceCount = invoice.Count(y => y.user_id == o.user_id), 
      InvoiceSum = invoice.Where(y => y.user_id == o.user_id).Sum(y => y.amount) 
     } 
    ).GroupBy(x => new { x.FirstName, x.LastName }) 
    .Distinct()