【发布时间】:2016-05-27 16:08:30
【问题描述】:
有谁知道最有效的方法是检查大型数据库表中是否存在多个项目(最多 1000 个)(1,000,000 行+),看看是否需要添加它们,使用 EF / Linq / Sql Server db(托管在 Azure 上)?
目前,使用以下两种方法,我的性能一直很慢(尽管当我最初在本地 Sql 数据库上开发时,它要好得多)。
我是否需要考虑离开 EF 来完成这项任务,并直接针对 db 运行一些 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 db 运行 sql profiler 跟踪,并发现 EF 将其作为 importedFoos 中每个项目的单独 sql 查询运行,所以使用这种方法肯定没有任何优势。
【问题讨论】:
标签: c# entity-framework linq-to-sql azure-sql-database