Я использую Entity Framework 6.0 с локальным SQL-сервером SQL Server, я попытался использовать функцию Enumerable.Contains, но я нашел ее очень медленной, когда у нас есть большой список.Entity Framework 6: медленное выражение «WHERE NOT IN»
Я исследовал и обнаружил, что существует рекомендация использовать операторы SQL для этого случая, как описано в: Why is .Contains slow? Most efficient way to get multiple entities by primary key?.
Теперь я задаюсь вопросом, почему следующее утверждение настолько медленное, что занимает более 180 секунд, чтобы запустить «ToList()»?
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».
Извините, мой плохой английский ^^.
** Предупреждение ** ваш код уязвим для потенциальных атак на SQL-атаку! –
Сколько времени требуется, чтобы выполнить этот sql напрямую? –
Вы используете более новую версию Entityframework, которая имеет лучшую поддержку для [Enumerable.Contains] (http://blogs.msdn.com/b/adonet/archive/2013/10/17/ef6-rtm-available.aspx). –