2012-09-03 18 views
12

Proszę, pomóż mi zrozumieć moją sprawę, używając LINQ z GRUPĄ i SUMĄ.Zapytanie LINQ z GRUPĄ i SUMĄ

// Query the database 
IEnumerable<BestSeller> best_sellers = from bs in (db.MYDATABASE).Take(25) 
             where bs.COMPANY == "MY COMPANY" 
             group bs by bs.PRODCODE into g 
             orderby g.Sum(g.MQTY) 
             select new BestSeller() 
             { 
              product_code = , 
              product_description = , 
              total_quantity = 
             }; 

pragnę:

  • Take 25 największych pozycji z db.MYDATABASE
  • Grupa wszystkie wyniki poprzez bs.PRODCODE
  • zamówić przez sumy dla każdego bs. PRODCODE
  • Gdzie firma jest "MOJA FIRMA"
  • Następnie wprowadź dane do moich obiektów BestSeller()

Jestem zdezorientowany, ponieważ jak tylko dodam mój group do miksu, moja zmienna bs stanie się bezużyteczna.

Odpowiedz

31

Jestem zdezorientowany, ponieważ jak tylko dodaję moją grupę do miksu, zmienna bs stanie się bezużyteczna.

Tak, ponieważ nie masz już jeden element - jesteś teraz przetwarzania sekwencji grup przedmiotów. Możesz zdobyć pierwszy przedmiot dla każdej grupy, co, jak zakładam, byłoby dobrym sposobem na uzyskanie opisu?

var query = from bs in db.MYDATABASE.Take(25) 
      where bs.COMPANY == "MY COMPANY" 
      group bs by bs.PRODCODE into g 
      orderby g.Sum(x => x.MQTY) 
      select new BestSeller 
      { 
       product_code = g.Key, 
       product_description = g.First().DESCRIPTION, 
       total_quantity = g.Sum(x => x.MQTY) 
      }; 

Należy pamiętać, że bez podania zamówienia, "25 pierwszych pozycji z db.MYDATABASE" nie ma sensu. "Top" w jaki sposób? Możesz chcieć:

from bs in db.MYDATABASE.OrderByDescending(x => x.Price).Take(25) 

lub coś podobnego. Zauważ, że jeśli żadna z nich nie ma firmy "MOJEJ FIRMY", nie otrzymasz żadnych wyników ...

Lub jeśli chcesz mieć 25 najlepszych bestsellerów, chcesz "wziąć" część na samym końcu:

var query = from bs in db.MYDATABASE 
      where bs.COMPANY == "MY COMPANY" 
      group bs by bs.PRODCODE into g 
      orderby g.Sum(x => x.MQTY) descending 
      select new BestSeller 
      { 
       product_code = g.Key, 
       product_description = g.First().DESCRIPTION, 
       total_quantity = g.Sum(x => x.MQTY) 
      }; 
var top25 = query.Take(25); 
+4

Czy ta linia jest naprawdę ważna? 'product_description = g.Key.DESCRIPTION' –

+1

powinno być' g.Key' (dla kodu produktu) i 'g.First(). –

+0

Czy mogę zapytać, dlaczego 'x' jest używane w funkcji' g.Sum() '? – Luke

Powiązane problemy