Я хочу получить 10 самых заказываемых товаров. Мои таблицы выглядят примерно так:
Продукт
ProductID | ProductName
Заказанный товар
ProductID | OrderID
Заказать
OrderID | DateOrdered
На данный момент имею следующее:
return (from product in db.Products
from orderedProduct in db.OrderedProducts
where orderedProduct.ProductID == product.ProductID
select product).OrderByDescending(???).Distinct().Take(10);
Я отметил в приведенном выше запросе, где я не уверен, что поставить. Как сделать заказ по количеству продуктов, которые отображаются в таблице заказанных продуктов?
Ответ 1 · рейтинг 16 · Aziz
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);
Это даст вам 10 элементов, каждый элемент содержит объект продукта и целое число numberOfOrders.
Изменить:
Поскольку это будет возвращаемое значение для метода, и поскольку C# не позволяет возвращать анонимный тип (пока... эта функция есть в C# 4.0), вы преобразуете анонимный тип в класс.
Создайте класс типа, который вы хотите вернуть
public class ProductOrders
{
public ProductOrders() {
}
public Product product { get; set; }
public int numberOfOrders { get; set; }
}
и Используйте этот запрос для возврата объектов этого класса
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);
Возвращаемое значение теперь имеет тип IEnumerable<ProductOrders>.