LINQ to Entities与Where和Contains的性能问题

时间:2016-11-30 23:22:08

标签: c# sql linq

表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语句?

1 个答案:

答案 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();