检查多个项目是否存在的最有效方法
Most efficient way to check for existence of multiple items
有谁知道最有效的方法是检查大型数据库中是否存在多个项目(最多 1000 个)table(1,000,000 行以上)查看是否需要添加它们,使用 EF / Linq / a Sql Server db (hosted on Azure)?
目前我使用以下两种方法时性能非常慢(尽管我最初在本地 Sql 数据库上开发时要好得多)。
我是否需要考虑离开 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.Where(i => !context.foos.Any(f => f.Serial == i.Serial)).ToList();
命令中使用 .Any()
LINQ 命令时,我只是 运行 针对本地 sql 数据库的 sql 探查器跟踪,并且发现 EF 运行 将其作为 importedFoos
中每个项目的单独 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);
有谁知道最有效的方法是检查大型数据库中是否存在多个项目(最多 1000 个)table(1,000,000 行以上)查看是否需要添加它们,使用 EF / Linq / a Sql Server db (hosted on Azure)?
目前我使用以下两种方法时性能非常慢(尽管我最初在本地 Sql 数据库上开发时要好得多)。
我是否需要考虑离开 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.Where(i => !context.foos.Any(f => f.Serial == i.Serial)).ToList();
命令中使用 .Any()
LINQ 命令时,我只是 运行 针对本地 sql 数据库的 sql 探查器跟踪,并且发现 EF 运行 将其作为 importedFoos
中每个项目的单独 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);