2016-11-30 69 views
2

表A具有 - ID(PK),部分号码,代码1,代码2LINQ到实体性能问题哪里,并可包含

表B有 - InventoryID(PK)部分号码,第一部分,和一堆其他列。

我需要从表B得到的一切,其中表B的部分号码未在表A.

例:表B有部分号码123.在表A没有PARTNUMBER为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的partnumbers,并得到各部分表B哪里的零件号码不在表A中。

表B中约有11,000条记录,表A中有200,000条记录。 我应该得到约9000个零件不在表A中。

我遇到了第二条LINQ语句的巨大性能问题。如果我做一个.Take(100),那甚至需要20-30秒。 1000以上的任何东西都会花费太长时间。

有没有更好的方法来编写这个LINQ语句?

+0

TableA和TableB是否有某种关联?或者他们彼此独立? –

+0

他们是独立的。 – Triforce711

+0

如果您将partmaster添加到HashSet (假设PartNumber是一个int),那么使用列表时查找起来会更快。你可以做HashSet (... Distinct())。试试看看性能是否更好。 – SledgeHammer

回答

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