none
querys mediante EF... tema de rendimiento RRS feed

  • Pregunta

  • Buenas, tengo una QUERY tal que así:

    var myObj = ctx.MyEntidad.FirstOrDefault(condicion);

    yo pensaba que eso enviaba a la base de datos una query y te devolvia solo un registro (firstOrDefault)... pero veo que "MyEntidad" contiene TODOS los registros que hay en base de datos.... que pueden ser millones.

    Tengo dos preguntas para que me ayuden a entender el tema rendimiento de EF: 

    1. EntityFramework siempre se trae todos los registros de todos los objetos que vamos a consultar?

    2. (que no tiene mucho que ver con lo anterior) Si hago dos consultas sobre dos entidades distintas, se hacen dos llamadas distintas a la base de datos? Hay alguna forma de hacer dos querys distintas en una misma llamada para mejorar rendimiento?

    gracias.

    lunes, 29 de junio de 2015 13:53

Todas las respuestas

  • Te respondo al primer punto:

    Con linq vas construyendo una consulta que no se resuelve mientras no sea necesario (si se convierte el tipo o se recorre la enumeración). Por ejemplo:

    ctx.MiEntidad // Si se ejecutase ahora traería todos los registros // Añadir restricción los resultados a los objetos que tengan valor 3 en Propiedad. .Where(e => e.Propiedad == 3) // Construir el tipo de salida de la consulta. .Select(e => new SelectListItem() { Text = e.Nombre, Value = e.Propiedad }); // Aquí es donde se ejecuta realmente la consulta. .ToList();

    Probablemente hayas puesto un breakpoint en la línea de código que citas y hayas evaluado la expresión ctx.MyEntidad. En ese punto devuelve todos los registros, pero es que al invocar FirstOrDefault sobre esa query, la modificas indicando que restringes el resultado al primero que cumpla la condición. En ese punto es donde se ejecuta realmente la consulta contra la base de datos.

    Lo de las dos consultas en una misma llamada, no le veo mucho sentido. ¿Puedes poner un ejemplo?

    Espero haberte ayudado, saludos.

    lunes, 29 de junio de 2015 16:44