2011-03-26 89 views
1

我有一個內存中的對象列表。我想檢查每個數據庫是否存在於數據庫中,如果沒有,請將該對象的布爾屬性設置爲true。Linq - 如何檢查數據庫中是否存在對象

對象

class Part 
    { 
     public bool NewPart { get; set; } 
     public string PartNumber { get; set; } 
     public string Revision { get; set; } 
     public string Description { get; set; } 
    } 

列表包含零件的集合。對於每個部分,如果它存在於數據庫中,則NewPart應設置爲FALSE,否則爲TRUE。我正在尋找最有效的方法來做到這一點,因爲可能有數百個零件,所以我認爲對每個零件運行SQL查詢可能不是最有效的方法。

關於實現此目標的最佳方式的想法表示讚賞。

+0

零件表的主鍵是什麼?零件號? – 2011-03-26 12:24:28

回答

1

這要看ORM您使用,但LINQ2SQL你可以使用像查詢:

var query = from p in db.parts 
      where myList.Contains(p.PartNumber) 
      select p.PartNumber; 

然後,您可以使用IEnumerable返回到設置您的NEWPART場

作爲替代,如果你的最終目標是做一個Upsert類型的動作,那麼看看這個問題及其答案Insert Update stored proc on SQL Server(需要SQL級別的實現,而不是linq)

1

以下只會命中數據庫一次。

var myList = (from r in parts select r.PartNumber).ToList(); 

    var existingParts = (from r in dc.Parts 
     where myList.Contains(r.PartNumber) select r.PartNumber).ToList(); 

    foreach(var r in parts) 
     r.NewPart = existingParts.Contains(r.PartNumber); 

注意,生成的SQL很可能是這樣的

SELECT PartNumber 
FROM Parts Where PartNumber in (@p0, @p1, @p2, @p3 ....) 

所以這應該工作,如果的零件清單百元左右,但如果它是在2100

0

這是最有效的方法取決於實際數據的情況之一。

第一從數據庫獲取所有partNums:

HashSet<int> partNums = new HashSet<int>(from p in GetTable<DBPart> select p.PartNumber); 
foreach(var p in parts) 
    p.NewPart = partNums.Contains(p.PartNumber); 

第二查詢數據庫與相關partNumbers:

HashSet<int> partNums = new HashSet<int>(
    from p in GetTable<DBPart> where (from mp in parts select mp.PartNumber).Contains(p.PartNumber) select p.PartNumber); 
foreach(var p in parts) 
    p.NewPart = partNums.Contains(p.PartNumber); 

前者將高於在一定數目的行的更有效的數據庫,效率較低,因爲後者需要較長時間來構建更復雜的查詢,但前者會返回所有內容。

另一個因素是預期的命中百分比。如果這個數字是比較低的(即只在列表中的零件數量少會在數據庫中),那麼它可能是更有效地做:

Dictionary<int, Part> dict = partsSource.ToDictionary(p => p.PartNumber, p); 
foreach(int pn in 
    from p in GetTable<DBPart> where (from kv in dict select kv.Key).Contains(p.PartNumber) select p.PartNumber); 
    dict[pn].NewPart = true; 

哪裏partsSource是通過何種方式列表parts首先獲得,而不是獲得一個列表,我們獲得一本字典,它可以更有效地檢索我們想要的字典。然而,無論如何我們都會獲得parts作爲列表,然後我們在這裏不能真正獲得,因爲我們首先使用更多的努力來構建字典,而不是遍歷列表。

相關問題