表 A 包含 - ID(PK)、零件编号、代码 1、代码 2
表 B 包含 - InventoryID(PK) PartNumber、Part 和一堆其他列。
我需要从表 B 中获取所有内容,其中表 B 的 PartNumber 不在表 A 中。
示例:表 B 的零件编号为 123。表 A 中没有零件编号为 123。获取该行。
我目前拥有的:
using (SomeEntity context = new SomeEntity())
{
var partmasterids = context.PartsMasters.Select(x => x.PartNumber).Distinct().ToList();
var test = context.Parts.Where(x => !partmasterids.Contains(x.PartNumber)).ToList();
}
我目前首先从表 A 中获取并选择所有不同的部件号。
然后我检查表 A 和表 B 的零件编号,并从表 B 中获取每个零件,其中该零件编号不在表 A 中。
表 B 中约有 11,000 条记录,表 A 中约有 200,000 条记录。 我应该得到大约 9000 个表 A 中没有的零件。
我在第二个 LINQ 语句中遇到了巨大的性能问题。如果我执行 .Take(100),甚至需要大约 20-30 秒。超过 1000 的任何内容都会花费太长时间。
是否有更好的方法来编写此 LINQ 语句?
最佳答案
根据我对你问题的理解,SQL 中的等价物是这样的
SELECT DISTINCT B.PartNumber AS MissingParts
FROM TableB as B
LEFT OUTER JOIN TableA as A ON B.PartNumber = A.PartNumber
WHERE A.PartNumber IS NULL
运行该 SQL 并测量它所花费的时间。如果没有索引,这就是最快的速度。
现在,如果您确实必须在 EF 中执行此操作,则需要执行等效语句,并使用左连接完成。基于this question ,它看起来像这样
var query = from b in TableB
join a in TableA on b.PartNumber equals a.PartNumber into joind
from existsInA in joind.DefaultIfEmpty()
where existsInA == null
select b.PartNumber;
var missingParts = query.Distinct().ToList();
关于c# - Where 和 Contains 的 LINQ to Entities 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900060/