it-swarm.com.de

Konvertieren Sie einfache SQL-Gruppen in LINQ in SQL

Ich habe Probleme. Ich kann die vorhandenen Antworten auf Stack Overflow nicht verstehen und bin zu neu in LINQ to SQL, um es selbst herauszufinden.

Siehe diese SQL:

select p.Name as ProductName, SUM(o.NumberOf) as TotalOrdered from [Order] o
  join [Product] p on o.ProductId = p.Id
  group by p.Name

Gibt eine zweispaltige Nice-Tabelle mit den Produktnamen auf der linken Seite und die Gesamtzahl der bestellten Produkte (über alle Bestellungen) in der rechten Spalte zurück. Wie kann ich dies in LINQ to SQL duplizieren?

Hier ist was ich bis jetzt habe:

var ctx = new DataClasses1DataContext();
var totalProducts = (from o in ctx.Orders
                     join p in ctx.Products on o.ProductId equals p.Id
                     select new { p.Name, o.NumberOf })
    .GroupBy(t => t.Name)
    .Select(g => g.Key, ... );

Was geht am ...?

14
Lisa

Es sieht für mich so aus, wie du willst:

.Select(g => new { ProductName = g.Key, TotalOrdered = g.Sum(x => x.NumberOf) })

Sie können Ihre gesamte Abfrage entweder als einzelnen Abfrageausdruck ausführen oder ganz ohne Abfrageausdrücke verwenden:

var totalProducts = ctx.Orders
                       .Join(ctx.Products, o => o.ProductId, p => p.Id,
                             (o, p) => new { p.Name, o.NumberOf })
                       .GroupBy(t => t.Name,
                                pair => pair.Name, // Key selector
                                pair => pair.NumberOf, // Element selector
                                (key, numbers) => new { 
                                    ProductName = key,
                                    TotalOrdered = numbers.Sum()) 
                                });

Oder:

var totalProdcuts = from o in ctx.Orders
                    join p in ctx.Products on o.ProductId equals p.Id
                    group o.NumberOf by p.Name into g
                    select new { ProductName = g.Key, TotalOrdered = g.Sum() };
32
Jon Skeet
TotalOrdered = g.Sum(o => o.NumberOf)

verwenden Sie oben für .... als Aussage könnte sein

   select new { ProductName=  g.Key, TotalOrdered  = g.Sum(o => o.NumberOf) };

var query = from o in ctx.Orders
            join p in ctx.Products on 
            o.ProductId equals p.Id
            group o by new { p.Name, o.NumberOf } into g
            select new { ProductName=  g.Key, TotalOrdered  = g.Sum(o => o.NumberOf) };
4
Pranay Rana

Fügen Sie dies hier ein, falls es hilfreich ist zu wissen, wie dies durch die GroupJoin-Methode erreicht werden kann:

var totalProducts = ctx.Products.GroupJoin(ctx.Orders,
    outerKeySelProduct => outerKeySelProduct.Id,
    innerKeySelOrder => innerKeySelOrder.ProductId,
    (outerKeySelProduct, innerKeySelOrder) => new
    {
        ProductName = outerKeySelProduct.Name,
        TotalOrdered = innerKeySelOrder.Select(n => n.NumberOf).Sum()
    });

Ich freue mich, dass es bearbeitet werden kann, wenn es verbessert werden kann.

0
Lisa