Linq - 如何检查数据库中是否存在对象
我有一个内存中的对象列表。我想检查每个数据库是否存在于数据库中,如果没有,请将该对象的布尔属性设置为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查询可能不是最有效的方法。
关于实现此目标的最佳方式的想法表示赞赏。
这要看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)
以下只会命中数据库一次。
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
这是最有效的方法取决于实际数据的情况之一。
第一从数据库获取所有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
作为列表,然后我们在这里不能真正获得,因为我们首先使用更多的努力来构建字典,而不是遍历列表。
零件表的主键是什么?零件号? – 2011-03-26 12:24:28