Как расшифровать этот запрос в LINQ (подзапрос)

#c# #linq

#c# #linq

Вопрос:

У меня возникли небольшие проблемы с выполнением этой GroupBy работы:

 select sum(QTDE)  from PEDIDO_ITEM group by IDPRODUTO order by 1 desc;
 

это должен быть подзапрос внутри запроса linq, который выглядит следующим образом:

 dynamic list =

                (from p in context.PRODUTOes
                 join c in context.CATEGORIAs
                 on p.IDCATEGORIA equals c.IDCATEGORIA
                 where c.IDCATEGORIA == subcategoria
                 orderby p.IDPRODUTO
                 select new
                 {
                     c.NOMECATEGORIA,
                     p.DESCRICAO_BREVE,
                     p.DESCRICAO_COMPLETA,
                     p.GARANTIA,
                     p.IDCATEGORIA,
                     p.DATACADASTRO,
                     p.IDPRODUTO,
                     p.LINKPRODUTO,
                     p.METADESCRICAO,
                     p.METATAGS,
                     p.MINIATURA,
                     p.STATUS,
                     p.TIPO,
                     p.TITULO,
                     p.VALOR,
                     p.VALOR_PROMOCIONAL,
                     p.VIEWS,
  ----> THIS ONE     QUANTIDADEVENDIDO = (from item in context.PEDIDO_ITEM where item.IDPRODUTO == p.IDPRODUTO group item by item.IDPRODUTO into q select q),
                                      
                 } 
 

Комментарии:

1. Если ваш подзапрос выбирает элементы для одного IDPRODUTO, зачем вам нужна группа по?

Ответ №1:

Попробуйте выполнить этот запрос:

 var query =
    from p in context.PRODUTOes
    join c in context.CATEGORIAs on p.IDCATEGORIA equals c.IDCATEGORIA
    where c.IDCATEGORIA == subcategoria
    orderby p.IDPRODUTO
    select new
    {
        c.NOMECATEGORIA,
        p.DESCRICAO_BREVE,
        p.DESCRICAO_COMPLETA,
        p.GARANTIA,
        p.IDCATEGORIA,
        p.DATACADASTRO,
        p.IDPRODUTO,
        p.LINKPRODUTO,
        p.METADESCRICAO,
        p.METATAGS,
        p.MINIATURA,
        p.STATUS,
        p.TIPO,
        p.TITULO,
        p.VALOR,
        p.VALOR_PROMOCIONAL,
        p.VIEWS,
        QUANTIDADEVENDIDO = context.PEDIDO_ITEM
            .Where(x => x.IDPRODUTO == p.IDPRODUTO)
            .Sum(x => x.QTDE)
    };  
 

Комментарии:

1. Это был именно тот синтаксис, который мне был нужен, но я не понимал, прямо на месте! Большое вам спасибо за помощь!!

Ответ №2:

Попробуйте следовать :

 (from p in context.PRODUTOes
                 join c in context.CATEGORIAs.Where(x => x.IDCATEGORIA == subcategoria) on p.IDCATEGORIA equals c.IDCATEGORIA
                 join pe in context.PEDIDO_ITEM on p.IDPRODUTO equals pe.IDPRODUTO
                 orderby p.IDPRODUTO
                 select new { c = c, p = p, pe = pe})
                 .OrderBy(x => x.p.IDPRODUTO)
                 .Select(x => new {
                     NOMECATEGORIA = x.c.NOMECATEGORIA,
                     DESCRICAO_BREVE = x.p.DESCRICAO_BREVE,
                     DESCRICAO_COMPLETA = x.p.DESCRICAO_COMPLETA,
                     GARANTIA = x.p.GARANTIA,
                     IDCATEGORIA = x.p.IDCATEGORIA,
                     DATACADASTRO = x.p.DATACADASTRO,
                     IDPRODUTO = x.Key,
                     LINKPRODUTO = x.p.LINKPRODUTO,
                     METADESCRICAO = x.p.METADESCRICAO,
                     METATAGS = x.p.METATAGS,
                     MINIATURA = x.p.MINIATURA,
                     STATUS = x.p.STATUS,
                     TIPO = x.p.TIPO,
                     TITULO = x.p.TITULO,
                     VALOR = x.p.VALOR,
                     VALOR_PROMOCIONAL = x.p.VALOR_PROMOCIONAL,
                     VIEWS = x.p.VIEWS,
                     QUANTIDADEVENDIDO = x.pe                                          
                 })
                 .GroupBy(x => x.IDPRODUTO)
                 .ToList();
 

Комментарии:

1. После GroupBy этого вы можете выбрать только ключевые поля и результат агрегирования.

2. Перемещение Groupby после выбора решает проблему.

3. Лучше просмотрите, что генерируется после такого запроса LINQ.