2010-10-18 4 views
10

Je me bats avec LINQ essayer d'apprendre la syntaxe et je ne peux pas comprendre comment faire la requête simplesql simple à la requête Linq avec le groupe et par des fonctions d'agrégation

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 
suivant

Toute aide tourner cette en linq serait génial.

Répondre

15

La requête que vous êtes après devrait être assez proche de celle-ci:

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

Amusez-vous!

+1

Merci. Je me battais depuis un petit moment car je n'arrivais pas à trouver comment faire pour que le groupe et invoice.amount fonctionnent ensemble, mais cela semble faire l'affaire, du moins en utilisant LinqPad ça marche – cdmdotnet

0

hey ce site peut vous aider:

101 Linq Samples

a des exemples de la plupart des fonctions de LINQ, si u ne figure pas, je peux écrire pour vous plus tard si quelqu'un ne fonctionne pas.

+0

Ouais, je vis que la vue, confus l'enfer hors de moi et semblait causer plus de confusion que de fournir des réponses. Merci quand même. – cdmdotnet

0

Je pense que vous avez une divergence dans votre clause de jointure - vous vous joignez à la facture interne sur user_id. Je suppose que vous avez l'intention de joindre cela à l'utilisateur?

Dans tous les cas, voici mon meilleur coup:

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

Quant aux suggestions LINQ, je vous suggère certainement télécharger et jouer avec LINQPad. Je l'utilise tout le temps pour tester les instructions LINQ sans Visual Studio. Il convertira également vos instructions LINQ en SQL, ce qui vous intéresse probablement particulièrement.

Éditer: La déclaration de l'énigmatique est beaucoup plus proche de ce que vous avez demandé que la mienne. Je ne suis pas tombé sur le groupement de colonnes dans les exemples avec lesquels j'ai travaillé.

4

Depuis op mentionné la syntaxe d'apprentissage, voici une version couramment:

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