Поиск строк, которых уже нет в БД - PullRequest
1 голос
/ 30 января 2012

У меня проблемы с производительностью в приложении.Одна из больших операций - сравнение строк.Я загружаю список строк, примерно 1000 - 10000. Это все уникальные строки.Затем мне нужно проверить, существуют ли эти строки в базе данных.Используемый мной запрос linq выглядит следующим образом:

IEnumerable<string> allNewStrings = DownloadAllStrings();

var selection = from a in allNewStrings
                where !(from o in context.Items
                        select o.TheUniqueString).Contains(a)
                select a;

Я что-то не так делаю или как можно ускорить этот процесс предпочтительно с Linq?

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 января 2012

Альтернативным решением будет использование HashSet:

var set = new HashSet<string>(DownloadAllStrings());
set.ExceptWith(context.Items.Select(s => s.TheUniqueString));

set теперь будет содержать строки, которых нет в БД.

1 голос
/ 30 января 2012

Вы запрашивали одни и те же уникальные строки 1000 - 10000 раз для каждого элемента в allNewStrings, поэтому это крайне неэффективно.

Попробуйте запросить уникальные строки отдельно, чтобы они выполнялись один раз:

IEnumerable<string> allNewStrings = DownloadAllStrings();

var uniqueStrings = from o in context.Items
                    select o.TheUniqueString;

var selection = from a in allNewStrings
                where !uniqueStrings.Contains(a)
                select a;

Теперь вы можете видеть, что последний запрос может быть написан с использованием Except, что более эффективно для случая операторов множеств, таких как ваш пример:

var selection = allNewStrings.Except(uniqueStrings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...