2010-10-09 227 views
1

如何將嵌套SELECT語句的SQL查詢轉換爲LINQ語句?將SQL查詢轉換爲LINQ到SQL

我有下面的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是包含修訂號的項目的ID,例如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和NOT 45是因爲它們的所有部分相同的MANUFACTUREORDER_I。因此,在這個系統中,這意味着庫存有15個,但其中兩個已經被交易掉了。因此,3行,一個爲貨物進貨,另外兩個爲兩個項目缺貨(忽略這些行中的數量)

正如我在開始時提到的,上面的SQL給了我輸出我後,但我不確定如何在Linq複製這個。

更新 - 傑夫的原始解決方案

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

LINQ to SQL使用對象而不是數據庫表。所以一旦你有你的實體設置,你可以開始玩他們。 – 2010-10-09 15:51:01

+0

我在VS2010中創建了Linq to Sql類,並添加了一個到數據庫的連接,然後添加了所需的數據庫對象。 – sparkymark75 2010-10-09 16:56:06

+0

簡化您的問題,編寫Linq代碼來選擇COUNT很容易解釋。編寫代碼來模仿你的業務邏輯是... *你的*工作。 – 2010-10-09 17:52:14

回答

1

在這裏你去。不幸的是,我看不到你留下的評論,但我相信這應該是相同的。我更改了名稱以與您的查詢密切配合。

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() 
      }; 
+0

傑夫上的斑點。非常感謝您花時間提供幫助。 – sparkymark75 2010-10-09 20:17:54