操纵Linq输出

时间:2010-09-07 16:02:31

标签: 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执行一个逻辑检查,并根据结果更改它的值。然后,这将用于将项目组合在一起。

它只是一个迭代事物,执行逻辑然后进行更改的情况吗?

2 个答案:

答案 0 :(得分:0)

  

它只是一个迭代事物,执行逻辑然后进行更改的情况吗?

是的,但如果您的数据放在SQL数据库中,那么创建SQL脚本以执行您想要的操作可能会更高效。关系数据库非常擅长在大集合上执行操作。将数据拉到客户端并一次更新一个记录可能要慢得多。

答案 1 :(得分:0)

  

它只是一个迭代事物,执行逻辑然后进行更改的情况吗?

基本上,是的,那会有效。但是,我建议您将最后一行更改为:

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

这将强制联盟进行全面评估,这允许您进行更改,并进行分组(可能需要第二次迭代等),而不会强制对您的联盟进行多次评估,或导致奇怪的,可能意外的行为

此外,如果数据已经存储在数据库中,那么尝试在服务器上执行逻辑(作为查询本身的一部分)可能会更有效,并适当地提取数据。这可能会减少通过线路提取的数据量(“分组”可能首先发生)并在客户端完成处理。