Нужна помощь в преобразовании оператора SQL с группировкой и суммой в LINQ to Entities - PullRequest
1 голос
/ 22 июня 2011

У меня есть следующий оператор SQL, который я пытаюсь преобразовать в LINQ to Entities, но правильное решение намекает мне на данный момент:

select  op.orders_products_id,
        op.products_id,
        op.products_model,
        op.products_name,
        op.products_price,
        sum(op.products_quantity) as quantity,
        sum(op.count_quantity) as count_quantity
from orders_products op
where orders_id = 574214
group by op.products_id
order by op.products_model, op.orders_products_id

В этом конкретном операторе SQL orders_products_id являетсяпервичный ключ для таблицы, поэтому, когда мы группируем по значению products_id, он свернет все повторяющиеся строки в таблице для того же product_id, и результатом столбца количества будет общее количество для всех столбцов.Учитывая оператор заказа, op.orders_products_id должен в конечном итоге быть идентификатором первой строки для каждого конкретного продукта, который имеет несколько записей в одной таблице.

Чтобы выбрать строки, используя LINQ to Entities без группировки, ябудет использовать следующий код:

using (var uow = new StoreEntities()) {
    var query = from op in uow.OrderProducts
                where op.OrderID == 574214
                orderby op.Model, op.OrderProductID
                select new {
                    ID = op.OrderProductID,
                    ProductID = op.ProductID,
                    Model = op.Model,
                    Name = op.Name,
                    SalePrice = op.SalePrice,
                    Qty = op.Qty,
                    CountedQty = op.CountedQty,
                };
    var list = query.ToList();
}

Но в настоящий момент я совершенно заблудился относительно того, как бы я делал группировку, чтобы получить тот же результат, что и мой исходный SQL?Когда я делаю группировку в LINQ to Entities, результатом группировки является новая последовательность с ключом и деталями элементов для этого ключа.Как мне сгладить это, чтобы я мог получить результаты, аналогичные тому, как я написал исходный запрос SQL?

1 Ответ

1 голос
/ 22 июня 2011

Если вы не хотите использовать функцию агрегирования для несгруппированного свойства, вам нужно будет произвольно выбрать строку, в примере, который я использовал FirstOrDefault() метод

var query = (from op in uow.OrderProducts
            where op.OrderID == 574214
            group op by op.OrderProductID
            select new 
            {
              ID = op.Key,
              ProductID = op.FirstOrDefault().ProductID,
              Model = op.FirstOrDefault().Model,
              Name = op.FirstOrDefault().Name,
              SalePrice = op.FirstOrDefault().SalePrice,
              Qty = op.Select(p => p.products_quantity).Sum(),
              CountedQty = op.Select(p => p.CountedQty).Sum(),
             })
             .OrderBy(op => op.ProductID)
             .ThenBy(op => op.OrderProductID);
...