Несколько запросов и производительности LinqToSQL - PullRequest
1 голос
/ 26 января 2009

Что-то подобное плохо влияет на производительность?

var myQuery = from c in Customers select c;

var filter1 = from c in myQuery where c.ID > 2 select c;

myQuery = filter1;

var filter2 = from c in myQuery where c.Name.Contains("r") select c;

myQuery = filter2;

Когда я делаю это, кажется, что в действительности выполняется только запрос в конце, а не на каждом "var ...". Все до этого момента, кажется, просто строит запрос, так что кажется, что это нормально, и нет большой разницы в производительности от размещения всех фильтров в одном запросе. Я не прав, и он фактически выполняет несколько запросов к базе данных?

Я пытаюсь найти хороший способ создания запросов на основе ввода пользователя, чтобы они могли фильтроваться по различным критериям. Я не слишком беспокоюсь о производительности, пока это не займет много времени.

Я также нашел сообщения о библиотеке Dynamic Linq, но использование этого кажется неуклюжим, и я не вижу особой разницы в этом.

Ответы [ 2 ]

6 голосов
/ 26 января 2009

Нет, он не будет выполнять какие-либо запросы, пока вы не начнете фактически запрашивать результаты. Создание запросов таким способом - это хорошо, и одна из приятных вещей в LINQ.

Кстати, в LINQ to Objects он работает одинаково (с точки зрения отложенного выполнения - фактический конвейер сильно отличается), если вы используете ленивый оператор запроса (в основном все те, которые возвращают IEnumerable<T> или IOrderedEnumerable<T>).

3 голосов
/ 26 января 2009

Я бы посмотрел на использование методов Extension для динамического построения запроса. Я думаю, что это будет делать именно то, что вам нужно сделать. И да, запрос фактически не оценивается, пока не будет выполнена операция, требующая результатов, поэтому их объединение не обязательно приведет к дополнительным поездкам в базу данных.

var query = db.Customers;
if (selectID.HasValue)
{
   query = query.Where( c => c.ID > selectID.Value );
}
if (!string.IsNullOrEmpty( nameFilter ))
{
   query = query.Where( c => c.Name.Contains( nameFilter ) );
}

foreach (var customer in query) // now the query is performed
{
 ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...