检查多个项目是否存在的最有效方法

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);