我有两个问题,我在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 :(得分:0)
它只是一个迭代事物,执行逻辑然后进行更改的情况吗?
是的,但如果您的数据放在SQL数据库中,那么创建SQL脚本以执行您想要的操作可能会更高效。关系数据库非常擅长在大集合上执行操作。将数据拉到客户端并一次更新一个记录可能要慢得多。
答案 1 :(得分:0)
它只是一个迭代事物,执行逻辑然后进行更改的情况吗?
基本上,是的,那会有效。但是,我建议您将最后一行更改为:
var rawData = reWorkData.Union(newBuildData).ToList();
这将强制联盟进行全面评估,这允许您进行更改,并进行分组(可能需要第二次迭代等),而不会强制对您的联盟进行多次评估,或导致奇怪的,可能意外的行为
此外,如果数据已经存储在数据库中,那么尝试在服务器上执行逻辑(作为查询本身的一部分)可能会更有效,并适当地提取数据。这可能会减少通过线路提取的数据量(“分组”可能首先发生)并在客户端完成处理。