2010-11-04 10 views
24

¿Hay alguna diferencia entre estas dos formas de consultar el contexto?Entity Framework. Where method encadenando

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId) 
      .Where(f => f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId && f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Parece que el encadenamiento está perfectamente bien para lograr la condición AND. No creo que puedas encadenar declaraciones OR. ¿Hay alguna razón para preferir uno sobre otro o escenarios cuando uno es mejor/más eficiente?

Respuesta

34

Ambos deben producir el mismo resultado final (si no me equivoco) pero encuentro que el segundo es más legible y muestra mejor el intento original.


actualización

acabo verificado la declaración anterior usando LINQPad. Ambas consultas producirán, de hecho, el mismo SQL.

Por ejemplo:

context.SomeTable.Where(c => c.ParentId == null) 
       .Where(c => c.Name.Contains("F")) 
       .Select(c => c.Name); 

Produce:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL) 

Qué es la misma SQL que se produce por:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F")) 
       .Select(c => c.Name); 



Usted podría cosas también compactas un poco más (que me parece preferible por las mismas razones que el anterior):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                && f.AnotherId == anotherId); 
+1

+1 para la legibilidad – TGnat

+0

+1 para LinqPad. – Omar

+5

El primero es el más fácil de leer para mí. Puede ver inmediatamente que hay dos condiciones separadas que deben coincidir y alinearse perfectamente. Claro que el segundo también tiene dos condiciones, pero se necesita un segundo extra para analizar que hay un && en la línea. – Ryan

0

Puede depurar a través del código y ver el SQL que se genera como resultado de cada uno. Me imagino que se convierte en la misma consulta.

2

Mi conjetura es que el tiempo que se está trabajando con en IQueryable (como sus colecciones de contexto probablemente son), al utilizar las extensiones encadenadas frente a la cláusula de predicado completo se logra lo mismo. Esto es porque IQueryable permite la ejecución diferida, por lo que esencialmente el mismo SQL se genera detrás de las escenas.