gpt4 book ai didi

c# - Entity Framework 6 : Slow "WHERE NOT IN" statement

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:06 25 4
gpt4 key购买 nike

我将 Entity Framework 6.0 与 SQL Server localdb 一起使用,我尝试使用 Enumerable.Contains 功能,但当我们有一个大列表时我发现​​它非常慢。

我研究了一下,发现这个案例有推荐使用sql语句,详见:Why is .Contains slow? Most efficient way to get multiple entities by primary key? .

现在我想知道为什么下面的语句这么慢,运行“ToList()”需要 180 多秒?

using (var context = new MyDbContext())
{
Random rand = new Random();
var ids = new List<int>();
for (int i = 0; i < 20000; i++)
ids.Add(rand.Next(550000));

Stopwatch watch = new Stopwatch();
watch.Start();

var values = new StringBuilder();
values.AppendFormat("{0}", ids[0]);
for (int i = 1; i < ids.Count; i++)
values.AppendFormat(", {0}", ids[i]);

var sql = string.Format(
"SELECT * FROM [MyDb].[dbo].[MyEntities] WHERE NOT [ID] IN ({0})",
values);

var result = context.Set<MyEntity>().SqlQuery(sql).ToList();

watch.Stop();
var msec = watch.ElapsedMilliseconds;
}

请注意,该语句类似于上面的链接 test3,只是我们包含了术语“NOT”。

抱歉我的英语不好^^。

最佳答案

像您这样向数据库发送一个非常大的过滤条件可能会非常慢。根据表的大小,检索所有值并在内存中进行过滤而不是使用 HashSet 会快得多。试试这个:

Random rand = new Random();
var set= new HashSet<int>();
for (int i = 0; i < 20000; i++)
set.Add(rand.Next(550000));

Stopwatch watch = new Stopwatch();
watch.Start();

var sql = "SELECT * FROM [MyDb].[dbo].[MyEntities]";

var result = context.Set<MyEntity>()
.SqlQuery(sql)
.AsEnumerable()
.Where(x => !set.Contains(x.ID))
.ToList();

watch.Stop();

关于c# - Entity Framework 6 : Slow "WHERE NOT IN" statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110838/

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