Pregunta ¿Puede alguien explicar mejor qué 'Proyecciones' están en nHibernate?


Como nuevo usuario de nHibernate y su biblioteca de utilidades, nhibernate fluido, estoy tratando de aprender lo suficiente como para ser peligroso con una buena base de datos.

Estoy teniendo una gran dificultad para entender el concepto de Proyecciones. Específicamente, ¿Qué demonios son?

Literalmente he hecho búsquedas exactas en '¿Qué son proyecciones?'y'Proyectos en nHibernate'y'nHibernate, proyecciones, definición', etc. Y todavía estoy muy confundido. Las publicaciones más útiles hasta ahora son Esta otra pregunta de StackOverflow y Esta publicación del blog por Colin Ramsay. Pero todavía estoy muy confundido. Mi conocimiento de las bases de datos sigue siendo de nivel de entrada en el mejor de los casos.

Realmente no entiendo qué son las proyecciones, por qué querría usarlas, qué están logrando, etc. Veo en la entrada del blog que las está usando para obtener una lista de enteros (presumo claves principales) para que él puede usarlos en una consulta diferente, pero esto es algo nebuloso en la forma en que funciona y el por qué.


28
2018-05-26 14:37


origen


Respuestas:


Aquí hay un ejemplo práctico.

Digamos que tienes una tienda en línea y una de tus clases de dominio es una Brand como "Samsung". Esta clase tiene un bote de propiedades asociadas, quizás un número entero Identity, un Name, un texto libre Description campo, una referencia a Vendor objeto, y así sucesivamente.

Ahora digamos que desea mostrar un menú con una lista de todas las marcas que se ofrecen en su tienda en línea. Si lo haces session.CreateCriteria<Brand>().List(), entonces de hecho vas a obtener todas las marcas. Pero también habrás chupado todo el largo Description campos y referencias a Vendors de la base de datos, y no es necesario para mostrar un menú; solo necesitas el Name y el Identity. En cuanto al rendimiento, absorber todos estos datos adicionales de la base de datos ralentiza las cosas y no es necesario.

En su lugar, puede crear un objeto de "proyección" que contenga solo el Identity y el Name llamándolo, por ejemplo, NameIdentityPair:

public class NameIdentityPair
{
    public int Identity { get; set; }
    public string Name { get; set; }
}

Y podría decirle a NHibernate que solo seleccione los datos que realmente necesita para realizar la tarea en cuestión, diciéndole que transforme el conjunto de resultados en su proyección:

var brandProjections = this.session.CreateCriteria<Brand>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Identity"), "Identity"))
    .SetResultTransformer(Transformers.AliasToBean<NameIdentityPair>())
    .List<NameIdentityPair>();

foreach (var brandProjection in brandProjections)
{
    Console.WriteLine(
        "Identity: {0}, Name: {1}", 
        brandProjection.Identity, 
        brandProjection.Name);
}

Ahora no tienes una lista de Brands pero en su lugar una lista de NameIdentityPairs, y NHibernate solo emitirá una declaración SQL como SELECT b.Identity, b.Name from dbo.Brand b para obtener esta proyección, a diferencia de una declaración SQL masiva que toma todo lo necesario para hidratar una Brand objeto (por ejemplo, SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....)

Espero que esto ayude.


69
2018-05-26 15:11



Si está familiarizado con SQL, una proyección es la SELECT cláusula de una consulta, utilizada para seleccionar los campos de los resultados disponibles para devolver.

Por ejemplo, supongamos que tiene un Person con FirstName, LastName, Addressy Phone campos. Si desea que una consulta devuelva todo, puede dejar de lado la proyección, que es como SELECT * FROM Person en SQL. Si solo quieres los nombres y apellidos, crearías una proyección con FirstName y LastName-- cuál podría ser SELECT FirstName, LastName FROM Person en términos de SQL.


2
2018-05-26 15:08



Puede usar proyecciones para llamar a funciones sql como SUMA, COUNT ... o seleccionar campos individuales sin devolver una entidad.

"... Recuperando solo propiedades de una entidad o entidades, sin la sobrecarga de la carga la entidad misma en un alcance transaccional. Esto a veces se llama un informe consulta; se llama más correctamente proyección. "[NHibernate en acción]


1
2018-05-26 14:43