Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Linq to SQL: получите 10 самых заказываемых продуктов

Автор вопроса: ajbeavenОтветов: 1

Я хочу получить 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);

Я отметил в приведенном выше запросе, где я не уверен, что поставить. Как сделать заказ по количеству продуктов, которые отображаются в таблице заказанных продуктов?

  • Этот вопрос может оказаться полезным: stackoverflow.com/questions/1322675/ James Black 07.09.2009

sqlselectlinq-to-sql

Ответы

Ответ 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>.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы