robinson proyecciones proyeccion peters mapamundi goode conica cilindrica cartograficas c# nhibernate nhibernate-projections

c# - peters - ¿Alguien puede explicar mejor qué ''Proyecciones'' hay en nHibernar?



proyeccion de robinson (3)

Aquí hay un ejemplo práctico.

Digamos que tiene una tienda en línea y una de sus clases de dominio es una Brand como "Samsung". Esta clase tiene una gran cantidad de propiedades asociadas, tal vez una Identity entera, un Name , un campo de Description texto libre, una referencia a un objeto de Vendor , etc.

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

En su lugar, puede crear un objeto de "proyección" que contenga solo la Identity y el Name que lo llaman, 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 tiene una lista de NameIdentityPair , sino una lista de NameIdentityPair 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 recoge todo lo necesario para hidratar un objeto de Brand (por ejemplo, SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v .... ).

Espero que esto ayude.

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

Tengo una dificultad excepcional para entender el concepto de Proyecciones . En concreto, ¿qué demonios son?

Literalmente he hecho búsquedas exactas en '' ¿Qué son las proyecciones? ''y'' Proyectos en nHibernar ''y'' nHibernar, 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 de blog por Colin Ramsay . Pero todavía estoy muy confundido. Mi conocimiento de las bases de datos es todavía 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 publicación del blog que las está usando para obtener una lista de enteros (presumo Claves primarias) para que Puede usarlos en una consulta diferente, pero esto es un poco nebuloso en la forma en que funciona y el por qué.


Puede usar las proyecciones para llamar a funciones SQL como SUM, COUNT ... o seleccionar campos individuales sin devolver una entidad.

"... Recuperar solo las propiedades de una entidad o entidades, sin la sobrecarga de cargar la propia entidad en un ámbito transaccional. Esto a veces se denomina consulta de informe; más bien se llama proyección". [NHibernate en acción]


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

Por ejemplo, suponga que tiene una Person con los campos FirstName , LastName , Address y Phone . Si desea que una consulta devuelva todo, puede omitir la proyección, que es como SELECT * FROM Person in SQL. Si solo desea los nombres y apellidos, debe crear una proyección con FirstName y LastName , que sería SELECT FirstName, LastName FROM Person en términos de SQL.