Как преобразовать 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()
};