c#-检查多个项目是否存在的最有效方法
作者:互联网
有谁知道最有效的方法是使用EF / Linq / Sql Server数据库(db)检查大型数据库表(1,000,000行)中是否存在多个项目(最多1000个),以查看是否需要添加多个项目.在Azure上托管)?
目前,使用以下两种方法的性能都非常慢(尽管最初在本地Sql db上开发时效果要好得多).
我是否需要考虑将EF留给此任务,并直接对数据库运行一些SQL?
//loop to check all imported items against db
private void ImportNewSerialsWorkerUsingLoopCheck(List<foo> importedFoos)
{
List<foos> foosToAddToDb = new List<foo>();
foreach (var foo in importedFoos)
{
fooCheck = context.Foos.FirstOrDefault(f => f.Serial == foo.Serial);
if (fooCheck == null)
{
foosToAddToDb.Add(foo);
}
}
context.foos.AddRange(foosToAddToDb);
}
//use Any() to check all imported items against db
private void ImportNewSerialsWorkerUsingAnyCheck(List<foo> importedFoos)
{
var foosToAddToDb = importedFoos.Where(i => !context.foos.Any(f => f.Serial == i.Serial)).ToList();
context.foos.AddRange(foosToAddToDb);
}
更新资料
我刚刚在var foosToAddToDb = importedFoos中使用.Any()LINQ命令的同时,针对本地sql数据库运行了sql profiler跟踪,其中(i =>!context.foos.Any(f => f.Serial = = i.Serial)).ToList();命令,并发现EF将EF作为导入的Foos中每个项目的单独SQL查询运行,因此使用该方法似乎毫无优势.
解决方法:
您的第二个片段正在执行EF查询,这是Linq to objects查询的一部分,因此为什么要对每个项目执行查询.您只需要执行一个EF查询就可以一次往返数据库.
var serials = importedFoos. Select(foo => too.Serial);
var existing = context.Foos.Where(foo => serials.Contains(foo.Serial));
var toAdd = importedFoos.Except(existing);
标签:azure-sql-database,linq-to-sql,c,entity-framework 来源: https://codeday.me/bug/20191027/1941023.html