2009-09-07 19 views
6

Tôi muốn lấy 10 sản phẩm được đặt hàng nhiều nhất. bảng của tôi trông tương tự như sau:LINQ to SQL: Nhận 10 sản phẩm được đặt hàng nhiều nhất

sản phẩm
ProductID | ProductName

OrderedProduct
ProductID | OrderID

tự
OrderID | DateOrdered

Tại thời điểm này tôi đã có những điều sau đây:

return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     select product).OrderByDescending(???).Distinct().Take(10); 

Tôi đã lưu ý trong truy vấn ở trên, nơi tôi không chắc chắn nên đặt gì. Tôi làm cách nào để orderby số lượng sản phẩm xuất hiện trong bảng sản phẩm đã đặt hàng?

+0

Bạn có thể tìm thấy câu hỏi này hữu ích: http://stackoverflow.com/questions/1322675/linq-keyword-search-with-orderby-relevance-based-on-count-linq-to-sql –

Trả lời

16
return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     group orderedProduct by product into productGroups 
     select new 
     { 
       product = productGroups.Key, 
       numberOfOrders = productGroups.Count() 
     } 
     ).OrderByDescending(x => x.numberOfOrders).Distinct().Take(10); 

Nó sẽ cung cấp cho bạn 10 mục, mỗi mục chứa đối tượng sản phẩm và số nguyên Số nguyên đơn hàng.

Sửa:

Vì đây sẽ là một giá trị để đổi lấy một phương pháp, và vì C# không cho phép trả lại một loại vô danh (chưa .. tính năng này trong C# 4.0), các bạn convert loại ẩn danh thành một lớp.

Tạo một lớp các loại bạn muốn quay trở lại

public class ProductOrders 
{ 
    public ProductOrders() { 
    } 

    public Product product { get; set; } 
    public int numberOfOrders { get; set; } 
} 

và Sử dụng truy vấn này để trả lại đối tượng của lớp

return (from product in db.Products 
     from orderedProduct in db.OrderedProducts 
     where orderedProduct.ProductID == product.ProductID 
     group orderedProduct by product into productGroups 
     select new ProductOrders 
     { 
       product = productGroups.Key, 
       numberOfOrders = productGroups.Count() 
     } 
     ).OrderByDescending(x => x.numberOfOrders).Distinct().Take(10); 

Giá trị trả về tại là kiểu IEnumerable<ProductOrders>.

+0

Làm cách nào để đi về giải nén sản phẩm từ đối tượng này? – ajbeaven

+0

giả sử giá trị trả về được lưu trữ trong x, sử dụng 'x.product.ProductID' và' x.product.ProductName' – Aziz

+0

xin lỗi, tôi không chắc chắn kiểu dữ liệu nào tôi nên sử dụng để lưu trữ kết quả từ truy vấn ở trên. Tôi có tự làm không? – ajbeaven

Các vấn đề liên quan