编程语言
首页 > 编程语言> > c#-检查多个项目是否存在的最有效方法

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