2010-10-18 43 views
10

estoy luchando con LINQ tratando de aprender la sintaxis y no puedo encontrar la manera de hacer la siguiente consulta sencillaSQL sencilla para realizar consultas LINQ con GROUP BY y funciones de agregado

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 

Cualquier ayuda para convertir este en linq sería genial.

Respuesta

15

La consulta que está buscando debe ser bastante cerca de esta:

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

disfrutar!

+1

Gracias. Había estado batallando con esto por un tiempo ya que no podía encontrar la forma de hacer que el grupo y la factura.Montar para trabajar juntos, pero esto parece hacer el truco, al menos mientras se utiliza LinqPad funciona – cdmdotnet

0

oye este sitio puede ayudarle a:

101 Linq Samples

tiene ejemplos de la mayor parte de las funciones de LINQ, si u no averiguar, puedo escribir para usted más adelante, si alguien no lo hace.

+0

Sí he visto que la vista, confunde el infierno fuera de mí y parecía causar más confusión que dar respuestas. Gracias de todos modos. – cdmdotnet

0

Creo que tienes una discrepancia en tu cláusula de unión: estás uniendo internamente la factura a sí mismo en user_id. Supongo que tiene la intención de unir esto al usuario?

En cualquier caso, aquí es mi mejor tiro:

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

En cuanto a las sugerencias de LINQ, sin duda sugiero que descargar y jugar con LINQPad. Lo uso todo el tiempo para probar declaraciones LINQ sin Visual Studio. También convertirá tus declaraciones LINQ a SQL, lo que probablemente sea de particular interés para ti.

Edit: La afirmación de Enigmativity está mucho más cerca de lo que solicitó que la mía. No había tropezado con la agrupación de columnas en los ejemplos con los que trabajé.

4

Desde op mencionó sintaxis de aprendizaje, he aquí una versión de fluidez:

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