2011-01-19 8 views
18

Me pregunto si hay implicaciones de rendimiento de varias sentencias .Where(). Por ejemplo, yo podría escribir:¿Hay varias sentencias .Where() en LINQ, un problema de rendimiento?

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 
       ) 
     ); 

O, alternativamente, podría combinar todos ellos en la cláusula where(), así:

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 
       ) 
     ); 

¿La cadena de Donde() cláusulas perjudicar el rendimiento o son ¿equivalentes?

+0

creo LINQ compila tanto a una expresión similar, independientemente de cómo se construye (siempre y cuando no llame a ToList() o al tipo entre 'Where's' – sinelaw

Respuesta

16

En LINQ to Objects, habrá un golpe de rendimiento muy pequeño, porque básicamente la cadena del iterador será más larga; ir al siguiente elemento significa ir por una larga cadena de llamadas a MoveNext().

En LINQ to SQL y proveedores similares, esperaría que el mismo SQL se generara en ambos sentidos, por lo que no afectaría el rendimiento allí.

EDIT: Desde la redacción de este he encontrado un poco más acerca de la aplicación de LINQ a objetos - es un little more complicated ...

+0

bien. Muchas gracias. No sé si el ejemplo es el mejor, pero a veces creo que me resultará más fácil leer y comprender algunas consultas si encadenar varias declaraciones where que no tienen nada que ver entre sí./John – John

+0

@Jon, si entiendo correctamente entonces, para Objetos existe la posibilidad de optimización según el orden de las cláusulas where (que en SQL no existe porque el optimizador hace eso por usted)? Me imagino en LINQ-to-Entities que la optimización también es manejada por el back-end? – ekkis

+2

@ekkis: Sí; si pones un filtro barato que se deshace de la mayoría de los elementos candidatos primero, eso acelerará mucho las cosas. –

Cuestiones relacionadas