Является ли несколько операторов Where() в LINQ проблемой производительности?
Мне интересно, есть ли последствия для нескольких операторов Where(). Например, я мог бы написать:
var contracts = Context.Contract
.Where(
c1 =>
c1.EmployeeId == employeeId
)
.Where(
c1 =>
!Context.Contract.Any(
c2 =>
c2.EmployeeId == employeeId
&& c1.StoreId == c2.StoreId
&& SqlFunctions.DateDiff("day", c2.TerminationDate.Value, c1.DateOfHire.Value) == 1
)
)
.Where(
c1 =>
!Context.EmployeeTask.Any(
t =>
t.ContractId == c1.Id
)
);
Или, в качестве альтернативы, я мог бы объединить их все в одно предложение Where(), например:
var contracts = Context.Contract
.Where(
c1 =>
c1.EmployeeId == employeeId
&& !Context.Contract.Any(
c2 =>
c2.EmployeeId == employeeId
&& c1.StoreId == c2.StoreId
&& SqlFunctions.DateDiff("day", c2.TerminationDate.Value, c1.DateOfHire.Value) == 1
)
&& !Context.Employee_Task.Any(
t =>
t.ContractId == c1.Id
)
);
Оказывает ли цепь предложения Where() повреждение производительности или эквивалентны?
Ответы
Ответ 1
В LINQ to Objects будет очень небольшой удар производительности, потому что в основном цепочка итераторов будет длиннее - выборка следующего элемента означает увеличение длинной цепи вызовов MoveNext().
В LINQ to SQL и подобных провайдерах я ожидаю, что один и тот же SQL будет сгенерирован в любом случае, поэтому он не повлияет на производительность там.
EDIT: после написания этого я узнал немного больше о реализации LINQ to Objects - это немного сложнее...