¿Dapper solicita un objeto completo de la base de datos antes de las operaciones de Linq?

dapper dapper-contrib linq sql-server

Pregunta

He estado curioso por un tiempo acerca de cómo Dapper (o quizás otros ORM) manejan la recuperación de objetos cuando se combinan con LINQ.

Si tengo una clase como esta:

public static IEnumerable<SitePage> GetAll()
{
    using (IDbConnection cn = new SqlConnection(g.Global.CONX))
    {
        cn.Open();
        return cn.GetAll<SitePage>();
    }
}

y construyo una consulta como esta:

var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId });

Tengo curiosidad si en el fondo, todo el conjunto de registros se incluye incluyendo todas las otras columnas (que pueden contener varchar realmente grandes), o solo Dapper entiende de esta consulta para obtener las columnas que solicito desde sql db? Me doy cuenta de que es una especie de novedad, pero quiero entender mejor la interacción Dapper / LINQ.

Una pregunta similar se publicó aquí: select-specific-columns-using-linq-what-gets-transfer , aunque no estaba seguro si fue respondida completamente. El póster tenía 2 preguntas y tampoco usaba expresiones lambda, que generalmente prefiero.

La respuesta a esto me incendiará la mente (y posiblemente cambie la forma en que estoy codificando, ya que he sido cauteloso y siento que estoy escribiendo demasiados códigos a través de sql explícito).

Respuesta aceptada

Dapper no transforma sus expresiones lambda en SQL, por lo que en su caso, la consulta SQL que genera Dapper devuelve instancias completas de SitePage .

Una manera rápida de saber si ese es el caso si eche un vistazo a la firma del método GetAll<T> de Dapper. A medida que devuelve IEnumerable<T> , significa que devuelve una colección de T , por lo que cualquier operador que utilice después de eso, como Select en su caso, se aplicará a la colección completa. En resumen, ya no estás en el mundo Dapper después de llamar a GetAll<T> .

Si utilizó en el pasado los ORM completos, es decir, con más capacidades, no necesariamente mejores, como Entity Framework o NHibernate, notará que algunas API devuelven IQueryable<T> , que representa una consulta que aún no se ha completado. sido ejecutado. Entonces, los operadores que usa en un IQueryable<T> , como Select y Where , realmente modifican la consulta. Cuando materializas la consulta ToList o llamando a ToList o ToArray en ella, entonces el ORM transforma tu árbol de expresiones de consulta en SQL y envía esa consulta a la base de datos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué