studio - Obtenga un conjunto de resultados distintos de NHibernate con la API de Criteria?
nhibernate vs entity framework (5)
¿No puede ver la publicación del foro en este momento (enlace roto?), Por lo que quizás esta no sea la respuesta, pero puede agregar un DistinctRootEntityResultTransformer:
session.CreateCriteria(typeof(Product)
.Add(...)
.SetResultTransformer(new DistinctEntityRootTransformer())
Estoy tratando de obtener resultados distintos usando la API Criteria en NHibernate. Sé que esto es posible usando HQL, pero preferiría hacer esto usando la API de Criteria, porque el resto de mi aplicación se escribe usando solo este método. Encontré esta publicación en el foro , pero no he podido hacer que funcione. ¿Hay alguna manera con la API de criterios para obtener conjuntos de resultados distintos?
Editar: Al hacer esto, también quería excluir la columna Clave principal, que también es una identidad, y obtener los registros distintos restantes. ¿Hay alguna forma de hacer esto? Tal como está, los registros distintos devuelven duplicados porque la clave principal es única para cada fila, pero todos los demás campos son iguales.
También encontré el problema del número no nítido de elementos (utilizo fetch = "join" en mi archivo de mapeo). Usé Linq To Nhibernate para resolver el problema, que se usa de la siguiente manera:
var suppliers = (from supplier in session.Linq<Supplier>()
from product in supplier.Products
where product.Category.Name == produtCategoryName
select supplier).ToList().Distinct();
Por lo que vale, NHibernate: Optimización de consultas con proyecciones me ayudó básicamente con este mismo problema.
Estamos utilizando los medios más modernos y poderosos e impresionantemente pequeños para manejar esto ... sigue leyendo solo si estás preparado para lo increíble ... y no tiene NADA que ver con los criterios ...
CurrentSession()
.QueryOver<GoodBadAndUgly>
.Where(...)
.TransformUsing(Transformers.DistinctRootEntity)
Por lo tanto, si ha venido aquí con la esperanza de encontrar una manera de hacerlo que evite jugar con Criteria, aunque pensó que tendría que ir en esa dirección solo para agregar ''DISTINCT'' a su SQL ... no busque más
Para realizar una consulta distinta, puede configurar la proyección en los criterios a Projections.Distinct. Luego incluye las columnas que desea devolver. El resultado se vuelve a convertir en un objeto fuertemente tipado configurando el transformador de resultados en AliasToBeanResultTransformer, pasando el tipo en el que se debe transformar el resultado. En este ejemplo, estoy usando el mismo tipo que la entidad en sí, pero podría crear otra clase específicamente para esta consulta.
ICriteria criteria = session.CreateCriteria(typeof(Person));
criteria.SetProjection(
Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("FirstName"), "FirstName"))
.Add(Projections.Alias(Projections.Property("LastName"), "LastName"))));
criteria.SetResultTransformer(
new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));
IList<Person> people = criteria.List<Person>();
Esto crea SQL similar a (en SQL Server al menos):
SELECT DISTINCT FirstName, LastName from Person
Tenga en cuenta que solo las propiedades que especifique en su proyección se completarán en el resultado.
La ventaja de este método es que el filtrado se realiza en la base de datos en lugar de devolver todos los resultados a su aplicación y luego filtrar, que es el comportamiento de DistinctRootEntityTransformer.