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

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

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


person ajbeaven    schedule 07.09.2009    source источник
comment
Этот вопрос может оказаться полезным: stackoverflow.com/questions/1322675/   -  person James Black    schedule 07.09.2009


Ответы (1)


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>.

person Aziz    schedule 07.09.2009
comment
Как мне извлечь продукт из этого объекта? - person ajbeaven; 07.09.2009
comment
предполагая, что возвращаемое значение хранится в x, используйте x.product.ProductID и x.product.ProductName - person Aziz; 07.09.2009
comment
извините, я не уверен, какой тип данных я должен использовать для хранения результата запроса выше. Я делаю свой собственный? - person ajbeaven; 07.09.2009