gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:21:30 25 4
gpt4 key购买 nike

有谁知道最有效的方法是检查大型数据库表中是否存在多个项目(最多 1000 个)(超过 1,000,000 行)以查看是否需要添加它们,使用 EF/Linq/Sql Server 数据库(托管在 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(); 命令,并发现 EF 将它作为 importedFoos 中每个项目的单独 sql 查询来运行, 因此使用该方法似乎没有任何优势。

最佳答案

您的第二个代码段是作为 Linq to objects 查询的一部分执行 EF 查询,因此它对每个项目执行查询的原因。您只需执行一个 EF 查询即可往返数据库。

var serials = importedFoos. Select(foo => too.Serial);
var existing = context.Foos.Where(foo => serials.Contains(foo.Serial));
var toAdd = importedFoos.Except(existing);

关于c# - 检查多个项目是否存在的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com