2011-03-26 64 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作为列表,然后我们在这里不能真正获得,因为我们首先使用更多的努力来构建字典,而不是遍历列表。

相关问题