tutorial query español ejemplos c# linq

query - Grupo de C#Linq



linq c# tutorial español (2)

Estoy experimentando con Linq y estoy teniendo problemas para descubrir la agrupación. He pasado por varios tutoriales, pero por alguna razón no puedo resolver esto.

Como ejemplo, supongamos que tengo una tabla (SiteStats) con varias ID de sitios web que almacena un recuento de la cantidad de visitantes por tipo que han accedido a cada sitio en total y durante los últimos 30 días.

╔════════╦═════════════╦════════╦══════╗ ║ SiteId ║ VisitorType ║ Last30 ║ Total║ ╠════════╬═════════════╬════════╬══════╣ ║ 1 ║ 1 ║ 10 ║ 100 ║ ║ 1 ║ 2 ║ 40 ║ 140 ║ ║ 2 ║ 1 ║ 20 ║ 180 ║ ╚════════╩═════════════╩════════╩══════╝

En SQL, puedo obtener fácilmente los recuentos de SiteID 1 con lo siguiente:

SELECT SiteId, SUM(Last30) AS Last30Sum FROM Sites WHERE SiteId = 1 GROUP BY SiteId

y debería obtener una fila como ...

╔════════╦════════════╗ ║ SiteId ║ Last30Total║ ╠════════╬════════════╣ ║ 1 ║ 50 ║ ╚════════╩════════════╝

Sin embargo, no estoy seguro de cómo obtener este resultado con Linq. He intentado:

var statsRecord = from ss in db.SiteStats where ss.SiteId == siteId group ss by ss.SiteId into ss select ss;

pero no puedo recuperar el total con algo como statsRecord.Last30

¿Puede alguien decirme por favor dónde me estoy equivocando? Cualquier ayuda es apreciada.


La forma más sencilla de ilustrarlo es usando objetos en memoria para que quede claro lo que está sucediendo. LINQ to SQL debería poder tomar esa misma consulta LINQ y traducirla a SQL apropiado.

public class Site { static void Main() { List<Site> sites = new List<Site>() { new Site() { SiteID = 1, VisitorType = 1, Last30 = 10, Total = 100, }, new Site() { SiteID = 1, VisitorType = 2, Last30 = 40, Total = 140, }, new Site() { SiteID = 2, VisitorType = 1, Last30 = 20, Total = 180, }, }; var totals = from s in sites group s by s.SiteID into grouped select new { SiteID = grouped.Key, Last30Sum = (from value in grouped select value.Last30).Sum(), }; foreach (var total in totals) { Console.WriteLine("Site: {0}, Last30Sum: {1}", total.SiteID, total.Last30Sum); } } public int SiteID { get; set; } public int VisitorType { get; set; } public int Last30 { get; set; } public int Total { get; set; } }


En realidad, aunque el código de Thomas funcionará, es más útil usar una expresión lambda:

var totals = from s in sites group s by s.SiteID into grouped select new { SiteID = grouped.Key, Last30Sum = grouped.Sum( s => s.Last30 ) };

que usa el método de extensión Suma sin la necesidad de una operación LINQ anidada.

según los ejemplos de LINQ 101 - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped