Конвертировать запрос SQL в LINQ to SQL - PullRequest
1 голос
/ 09 октября 2010

Как преобразовать SQL-запрос с вложенными операторами SELECT в оператор LINQ?

У меня есть следующий оператор SQL, который выводит нужные мне результаты, но я не уверен, как повторить это в LINQ.

SELECT X.ITMGEDSC, (SUM(X.[ENDQTY_I]) - SUM(X.[ORDERLINES])) AS AVAIL 
FROM SELECT T1.[MANUFACTUREORDER_I],T2.[ITMGEDSC],T1.[ENDQTY_I],
(SELECT (COUNT(VW.[MANUFACTUREORDER_I]) - 1) 
FROM [PLCD].dbo.[vw_WIP_Srl] VW
WHERE VW.[MANUFACTUREORDER_I] = T1.[MANUFACTUREORDER_I]
GROUP BY VW.[MANUFACTUREORDER_I]) AS ORDERLINES 
FROM [PLCD].dbo.[vw_WIP_Srl] T1 
INNER JOIN [PLCD].dbo.IV00101 T2 ON T2.ITEMNMBR = T1.ITEMNMBR 
GROUP BY T1 [MANUFACTUREORDER_I],T2.[ITMGEDSC],T1.[ENDQTY_I]) AS X
GROUP BY X.ITMGEDSC

ITEMNMBR - это идентификатор позиции, включающей номер редакции, например, A1008001. Последние 3 цифры обозначают ревизию. Так что A1008002 - это один и тот же элемент, просто разные ревизии. В моем запросе мне нужно обработать их как один и тот же элемент и вывести только количество для номера родительского элемента (A1008). Этот номер родительского элемента является столбцом IV00101.ITMGEDSC.

Приведенный выше код будет принимать следующие данные

MANUFACTUREORDER_I        ITEMNMBR      ENDQTY_I 
MAN00003140               A1048008      15 
MAN00003507               A1048008      1 
MAN00004880               A10048001     15 
MAN00004880               A10048001     15 
MAN00004880               A10048001     15 

и выведите следующие результаты

ITEMNMBR      QTY 
A1048008      16 
A10048001     13*
  • Причина, по которой это значение равно 13, а НЕ 45, заключается в том, что они являются частью одного и того же MANUFACTUREORDER_I. Следовательно, в системе это означает, что на складе было 15, но два из них были затем опрошены для использования. Следовательно, 3 строки: одна для товаров, поступающих на склад, две другие для двух товаров, отсутствующих на складе (игнорируйте количество в этих строках)

Как я уже упоминал в начале, приведенный выше SQL дает мне вывод, который мне нужен, но я не уверен, как воспроизвести это в Linq.

ОБНОВЛЕНИЕ - ОРИГИНАЛЬНОЕ РЕШЕНИЕ JEFF

var query = from item in db.vw_WIP_Srls
group new { item.MANUFACTUREORDER_I, item.ENDQTY_I } by item.ITEMNMBR into items 
select new
{ 
    ItemNumber = items.Key, 
    QtyAvailable = (from item in items 
           //assumes quantities equal per order number 
           group 1 by item into orders 
           select orders.Key.ENDQTY_I - (orders.Count() - 1)) 
          .Sum()
};

1 Ответ

1 голос
/ 10 октября 2010

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

var query = from a in db.vw_WIP_Srl
            join b in db.IV00101 on a.ITEMNMBR equals b.ITEMNMBR
            group new { a.MANUFACTUREORDER_I, a.ENDQTY_I } by b.ITMGEDSC into g
            select new
            {
                ITMGEDSC = g.Key,
                AVAIL = (from item in g
                         group 1 by item into orders
                         select orders.Key.ENDQTY_I - (orders.Count() - 1))
                        .Sum()
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...