2010-09-07 91 views
0

我有兩個查詢,我在Linq這樣聯合在一起;操縱Linq輸出

var reWorkData = from a in db.IV30300s 
          join b in db.IV00101s on a.ITEMNMBR equals b.ITEMNMBR into t1 
          from b1 in t1.DefaultIfEmpty() 
          join c in db.IV30200s on a.DOCTYPE equals c.IVDOCTYP into t2 
          from c1 in t2.Where(c => a.DOCNUMBR == c.DOCNUMBR).DefaultIfEmpty() 
          where a.TRXLOCTN.ToUpper() == "QA" && 
          a.DOCTYPE == 1 && 
          (a.DOCDATE >= start && a.DOCDATE <= end) && 
          a.TRXQTY > 0 
          select new { A = a, B = b1 }; 

      var newBuildData = from a in db.IV30300s 
           join b in db.IV00101s on a.ITEMNMBR equals b.ITEMNMBR into t1 
           from b1 in t1.DefaultIfEmpty() 
           join c in db.IV30200s on a.DOCTYPE equals c.IVDOCTYP into t2 
           from c1 in t2.Where(c => a.DOCNUMBR == c.DOCNUMBR).DefaultIfEmpty() 
           where a.TRXLOCTN.ToUpper() == "PRODUCTION" && 
           a.TRNSTLOC.ToUpper() == "QA" && 
           a.DOCTYPE == 3 && 
           (a.DOCDATE >= start && a.DOCDATE <= end) && 
           a.TRXQTY > 0 
           select new { A = a, B = b1 }; 

      var rawData = reWorkData.Union(newBuildData); 

我然後需要做的是執行的邏輯塊上a.ITEMNMBR檢查和改變它的根據結果值。這將用於將項目組合在一起。

它只是一個遍歷事物,執行邏輯然後進行更改的情況?

回答

0

它只是一個遍歷事物,執行邏輯然後進行更改的情況?

基本上,這是行得通的。不過,我建議你改變你的最後一行:

var rawData = reWorkData.Union(newBuildData).ToList(); 

這將迫使歐盟全面評估,它允許你進行更改,並做您的分組(這可能需要第二次迭代,等等)而不會強行對您的聯盟進行多次評估,或造成奇怪的,可能意外的行爲。另外,如果數據已經存儲在數據庫中,那麼試圖在服務器上執行邏輯(作爲查詢本身的一部分)可能會更有效,並且適當地提取數據。這可能會潛在地減少通過線路拉取的數據量(「分組」可能首先發生)並在客戶端上完成處理。

0

它只是一個遍歷事物,執行邏輯然後進行更改的情況?

是的,但是如果您的數據放置在SQL數據庫中,那麼創建SQL腳本來執行您想要的操作可能效率更高。關係數據庫非常擅長在大集合上執行操作。將數據拉到客戶端並逐個更新記錄可能會慢很多。