2010-09-07 96 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脚本来执行您想要的操作可能效率更高。关系数据库非常擅长在大集合上执行操作。将数据拉到客户端并逐个更新记录可能会慢很多。