2010-10-18 11 views
10

sto combattendo con LINQ cercando di imparare la sintassi e non riesco a capire come effettuare le seguenti operazioni semplice querySemplice SQL per query LINQ con il gruppo da e funzioni di aggregazione

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 

Qualsiasi aiuto trasformare questo in Linq sarebbe fantastico.

risposta

15

La query che stai dopo dovrebbe essere abbastanza vicino a questo:

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

Enjoy!

+1

Grazie. Avevo combattuto per un po 'ora, dato che non riuscivo a capire come ottenere il gruppo e invocare fatture.valori di lavorare insieme, ma questo sembra fare il trucco, almeno mentre si usa LinqPad funziona – cdmdotnet

0

hey questo sito può aiutare a:

101 Linq Samples

ha esempi di maggior parte delle funzioni LINQ, se u non figura fuori, posso scrivere per voi in seguito, se qualcuno non lo fa.

+0

Sì ho visto che la vista, confuso l'inferno fuori di me e sembrava causare più confusione che fornire risposte. Grazie comunque. – cdmdotnet

0

Penso che tu abbia una discrepanza nella tua clausola di join: tu stai internamente unendo la fattura a se stessa su user_id. Suppongo che intendessi unirti a questo utente?

In ogni caso, qui è il mio colpo migliore:

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

Per quanto riguarda i suggerimenti LINQ, mi piacerebbe sicuramente suggerisco di scaricare e giocare con LINQPad. Lo uso sempre per testare le istruzioni LINQ senza Visual Studio. Converte anche le tue istruzioni LINQ in SQL, il che è probabilmente di particolare interesse per te.

Modifica: La dichiarazione di enigmatività è molto più vicina a ciò che ha richiesto rispetto alla mia. Non ero incappato nel raggruppamento delle colonne negli esempi con cui ho lavorato.

4

Dal op menzionato la sintassi di apprendimento, ecco una versione fluente:

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() 
Problemi correlati