Tak jste mě donutil pořádně se na LINQ podívat, protože tyhle věci obyčejně řeším na úrovni datbaáze stored procedurou nebo pohledem (což je rychlejší a nemusím přemýšlet, jak se to v LINQu píše). Víceméně vyberu všechno z tabulky LinqTests v datovém kontextu dc, groupuji podle skupiny do kolekce g. Kolekce g má pro každou skupinu vlastnost Key, což je to, podle čehož groupujeme, tedy hodnota sloupce skupina, a obsahuje všechny položky, které se slučovaly. Pomocí g.Sum pak dělám součty přes ty 3 sloupce. Nevýhodou C# je, že suma se v LINQ nedá napsat přes tu "krásnou" syntaxi, ale musí se použít tak, jak ji v ukázce používám. Jako parametr dostane lambda výraz, který se vyhodnotí pro každou položku (ta se uloží do j) a vrátí součet daných tří sloupců. Protože je to Sum, sečtou se výsledky lambda výrazu ze všech řádků a to je vlastně celé.
var sums = from i in dc.LinqTests
group i by i.Skupina into g
select new { Skupina = g.Key, Suma = g.Sum(j => j.Hodnota1 + j.Hodnota2 + j.Hodnota3) };
foreach (var s in sums)
Console.WriteLine("{0}:{1}", s.Skupina, s.Suma);
Kontroloval jsem to a vyplivne to velmi přímočarý SQL dotaz, myslím, že psát ho ručně, dopadlo by to úplně stejně.
SELECT SUM([t0].[Hodnota1] + [t0].[Hodnota2] + [t0].[Hodnota3]) AS [Suma], [t0].[Skupina]
FROM [dbo].[LinqTests] AS [t0]
GROUP BY [t0].[Skupina]
Vypadá to, že v nejbližší době přeložím taháky 101 LINQ Samples z MSDN ( http://msdn.microsoft.com/en-us/vbasic/b... a http://msdn.microsoft.com/en-us/vcsharp/... ) do češtiny a dám to v jazycích VB.NET i v C#, ať v tom mají všichni jasno.
|