2016-11-30 71 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();