Рефакторинг обработки IEnumerable и IQueryable (C#)
Имеются два объекта с типами IEnumerable и IQueryable
Один используется для обработки перечислений внутри памяти приложения, другой для отправки запросов к БД
Добавляются два метода фильтрации (по одному для каждого типа)
private IQueryable<Employees> CreateEmployeeQuery(IQueryable<Employees> query, EmployeeFilter employeeFilter)
{
var query = query.Where(w => employeeFilter.EmployeeId == null || w.Id == employeeFilter.EmployeeId);
return query;
}
private IEnumerable<Employees> CreateEmployeeQuery(IEnumerable<Employees> employees, EmployeeFilter employeeFilter)
{
var employees = employees.Where(w => employeeFilter.EmployeeId == null || w.Id == employeeFilter.EmployeeId);
return employees;
}
Хотелось бы уточнить, как будет влиять на производительность и есть ли какие-то подводные камни при использовании подхода: выделить один метод и делать преобразования .AsQueryable() или .AsEnumerable()
И какой метод в таком случае практичнее оставить? Или какие доводы есть в пользу каждого из методов?
Ответы (1 шт):
Единственный подводный камень, который я здесь увидел, это возврат значения, если фильтр null. Можно же в этом случае Where не навешивать.
Я бы написал как-то так.
private IEnumerable<Employees> CreateEmployeeQuery(IEnumerable<Employees> employees, EmployeeFilter employeeFilter)
{
return employeeFilter?.EmployeeId is null
? employees
: employees.Where(w => w.Id == employeeFilter.EmployeeId);
}
То же самое с IQueryable.
А так в целом вполне нормальный запрос, достаточно примитивный, ничего необычного. Смысла приводить IQueryable к IEnumerable не вижу.