2012-09-03 53 views
12

Vui lòng giúp tôi giải quyết vấn đề bằng LINQ với GROUP và SUM.Truy vấn LINQ với GROUP và 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 = 
             }; 

Tôi muốn:

  • Lấy 25 mặt hàng hàng đầu từ db.MYDATABASE
  • Nhóm tất cả các kết quả theo bs.PRODCODE
  • tự nó bằng tổng số tiền cho mỗi bs. PRODCODE
  • Trường hợp công ty là "CÔNG TY CỦA TÔI"
  • Sau đó, nhập dữ liệu vào các đối tượng BestSeller()
  • của mình

Tôi bối rối, vì ngay khi tôi thêm group vào kết hợp, biến số bs của tôi trở nên vô dụng.

Trả lời

31

Tôi bối rối, vì ngay sau khi tôi thêm nhóm vào danh sách kết hợp, biến bs của tôi trở nên vô dụng.

Có, bởi vì bạn không còn có một mục duy nhất - bạn hiện đang xử lý một chuỗi gồm nhóm của các mục. Bạn có thể nhận được ở mục đầu tiên cho mỗi nhóm, mà tôi giả định sẽ là một cách hợp lệ để nhận được mô tả?

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

Lưu ý rằng không chỉ định thứ tự, "25 mục hàng đầu từ db.MYDATABASE" không có ý nghĩa. "Top" theo cách nào? Bạn cũng có thể muốn:

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

hoặc tương tự. Lưu ý rằng nếu không ai trong số những công ty này có một công ty "CÔNG TY CỦA TÔI", bạn sẽ không có kết quả ...

Hoặc nếu bạn muốn 25 sách bán chạy nhất, bạn muốn phần "lấy" ở cuối cùng:

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

Dòng này có thực sự hợp lệ không? 'product_description = g.Key.DESCRIPTION' –

+1

phải là' g.Key' (cho product_code) và 'g.First(). Mô tả' cho product_description, tôi nghĩ vậy. –

+0

Tôi có thể hỏi tại sao 'x' được sử dụng trong hàm' g.Sum() '? – Luke