2012-02-07 10 views
7

? Cuál es la mejor manera de escribir el rendimiento de las consultas. p.ej. puedo escribir consulta para obtener todos los empleados en específico apellido que siga¿Cuál es la mejor forma de escribir consultas en Entity Framework

ObjectQuery<Employee> queryEmp = 
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName", 
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly); 

O

var v = from e in context.Employees where e.LastName == "Farooqi" select e; 

O

context.Employees.Where(e => e.LastName == "Farooqi"); 

O

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 

Mi pregunta es la que qué método para consultar es el mejor. Lo que me confunde es que creo (pero no estoy seguro) que al usar los últimos tres métodos distintos al primero obtendré todos los registros del empleado de la base de datos y luego enumeraré todos los registros que serán reincorporados que cumplan la condición especificada donde, Creo que las últimas tres formas tomarán más tiempo que la primera, así que solo usé la primera. Pero, ¿cuál es el mejor en realidad? No lo sé. ¿Todos los métodos solo recuperan registros de la base de datos que cumplen la condición were o recuperan todos los registros de db y luego se vuelven a registrar para devolver los registros filtrados al final de la aplicación?

Respuesta

9

Hay poca diferencia; el 2º/3º tiene la ventaja de aplicar la corrección de tipo en tiempo de compilación, ya que el árbol de expresiones no se compilará si LastName no existe o es (digamos) un int - evita errores tipográficos y el problema de "cadenas mágicas".

Re su suposición acerca de traer de vuelta todo; no. El 2do/3er compila a árboles de expresión, que pueden ser deconstruidos y utilizados para crear el SQL correcto (realizar el filtro en el servidor). Muy inteligente, pero a menudo malentendido. El punto clave es que esto es Queryable.Where (tomando un Expression<Func<T, bool>>), no Enumerable.Where (tomando un Func<T, bool>). Siéntase libre de realizar un seguimiento.

Del mismo modo, hay poca diferencia entre el 1º/4º: ambos se filtrarán en el servidor.

Cuestiones relacionadas