Поскольку Linq ленив, не имеет значения, есть ли у вас «один большой оператор» или несколько, если вы не выполняете свой запрос (например, путем повторения результатов или принудительного выполнения с использованием ToList()
) нет поскольку вы просто цепляете методы расширения. В этой связи я бы сосредоточился на удобочитаемости.
Есть вещи, которые следует учитывать, например, сортировка не может быть ленивой (вам нужно посмотреть все предметы, прежде чем вы сможете выплюнуть предметы в порядке) - вот почему вы всегда должны ставить свой фильтр Where
перед вашим OrderBy
, чтобы у вас было меньше товаров для сортировки. Это я сказал бы реструктурировать свой код так:
// get all errors
var viewModel = _errorsRepository.Errors;
// optionally filter
if (!String.IsNullOrEmpty(searchError))
{
string searchErrorMatch = searchError.Trim().ToLower();
viewModel = viewModel.Where(e => e.Message.ToLower().Contains(searchErrorMatch));
}
//order and project to ErrorViewModel
viewModel = viewModel.OrderByDescending(e => e.TimeUtc)
.Select(e => new ErrorViewModel
{
ErrorId = e.ErrorId,
Message = e.Message,
TimeUtc = e.TimeUtc
}).ToList();
Также обратите внимание, что я вытащил searchError.Trim().ToLower()
из вашего лямбда и назначили его переменной один раз - в противном случае это выполняется каждый раз лямбда вычисляется , что является действительно ненужной работой.
Заключительный изменить: Я также добавил ToList()
выполнить запрос после вашей проекции - в противном случае ваш запрос действительно будет выполнен с вашей точки зрения, которая в целом это плохо по многим причинам, например, вы должны поддерживать контекст базы данных в течение потенциально более длительного времени, и вы нарушаете разделение проблем. Представления должны учитывать только модель представления, но не имеют ничего общего с , получая данные.
Чувак, вот что я называю хорошим ответом. – ivowiblo