Является ли несколько операторов .Where () в LINQ проблемой производительности? - PullRequest
19 голосов
/ 19 января 2011

Мне интересно, есть ли влияние на производительность нескольких операторов .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 Ответ

17 голосов
/ 19 января 2011

В LINQ to Objects производительность будет очень небольшой, потому что в основном цепочка итераторов будет длиннее - выборка следующего элемента означает переход по длинной цепочке вызовов MoveNext ().

В LINQ to SQL и аналогичных провайдерах я ожидал, что один и тот же SQL будет сгенерирован в любом случае, поэтому это не повлияет на производительность.

РЕДАКТИРОВАТЬ: С момента написания этого я узнал немного больше о реализации LINQ to Objects - это немного сложнее ...

...