Linq2sql Оптимизация левого соединения, чтобы получить предметы, которые существуют только в 1 контейнере - PullRequest
0 голосов
/ 04 ноября 2010

Я хочу получить предметы из одного контейнера, которых нет в другом. Один контейнер IEnumerable, а другой объект в БД. Например

IEnumberable<int> ids = new List<int>();
ids.Add(1);
ids.Add(2);
ids.Add(3);
using (MyObjectContext ctx = new MyObjectContext())
{
   var filtered_ids = ids.Except(from u in ctx.Users select u.id);
}

Этот подход работает, но я понял, что базовый sql - это что-то вроде SELECT id FROM [Users] Это не то, что я хочу. Меняя его на

 var filtered_ids = ids.Except(from u in ctx.Users
                    where ids.Contains(u.id) 
                     select u.id);

улучшает базовый запрос и добавляет WHERE [id] IN (...), что выглядит намного лучше.

У меня есть 2 вопроса:

  1. Можно ли еще улучшить производительность для этого запроса?

  2. Насколько я помню, существует ограничение на количество параметров в IN. Сработает ли мой текущий запрос, если я превыслю предел (что вряд ли произойдет, но лучше подготовиться)?

1 Ответ

1 голос
/ 04 ноября 2010
  1. Этот запрос должен выполняться при условии наличия надлежащих индексов / первичных ключей.

  2. Верхний предел для параметров sql, принимаемых сервером sql, составляет около 2100. Если вы превысите предел, вы получите исключение sql вместо результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...