Производительность Linq Contains - PullRequest
1 голос
/ 21 января 2012

Мне нужно отфильтровать запрос linq, используя список фильтров, и я планирую использовать для этого метод contains.Так что это будет выглядеть примерно так:

List<string> filter = new List<string>();
filter.Add("foo");
filter.Add("bar");
//Additional filters go here, max of about 10 filters
var test = dbcontext.books.Where(x => filter.Contains(x.name)).ToList();

Таблица этого запроса имеет много записей (500 000), поле идентификации PK и индекс поля, к которому я буду обращаться.

Мои вопросы, прежде чем идти по этому пути, ожидаете ли вы, что производительность этого запроса будет приемлемой, или я должен использовать другой подход для такого большого набора данных?

Ответы [ 2 ]

6 голосов
/ 21 января 2012

Да, это должно быть хорошо;это будет просто переводить на

select x.* from [books] x where x.name in (@p0,@p1)

с @p0 = 'foo' и @p1 = 'bar';пока name проиндексирован, он должен работать нормально.Однако становится интереснее, если filter становится очень большим.10 штук звучит нормально.Я также неявно предполагаю, что он не будет возвращать все 500 000 - но ограничится нормальным числом;если нет, подумайте о добавлении некоторых ограничений .Take(number).

Если это так, просто измерьте его.Довольно просто запустить трассировку SQL или использовать инструмент профилирования.

0 голосов
/ 21 января 2012

Если все данные уже находятся в памяти по другим причинам, я полагаю, вы могли бы использовать этот подход.В противном случае база данных, вероятно, будет лучше, так как вы не будете загружать 500К записей в память одновременно.

select * from Books b where b.name IN {"foo", "bar", ...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...