表A具有 - ID(PK),PartNumber,Code1,Code2
表B有 - InventoryID(PK)PartNumber,Part和一堆其他列。
我需要从表B中获取表B中Part Bumber不在表A中的所有内容。
示例:表B具有PartNumber 123.表A中没有123的PartNumber。获取该行。
我现在有什么:
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的partnumbers并从表B中获取每个部分,其中部分编号不在表A中。
表B中有大约11,000条记录,表A中有200,000条记录。 我应该得到大约9000个不在表A中的部分。
我遇到了第二个LINQ语句的巨大性能问题。如果我做了.Take(100),那甚至需要大约20-30秒。超过1000的任何东西都会花费太长时间。
有没有更好的方法来编写这个LINQ语句?
答案 0 :(得分:3)
根据我对您的问题的理解,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();