¿Cómo seleccionar solo unas pocas columnas en mi consulta de NHibernate?

Tengo un mapeo de una clase a una tabla; desafortunadamente, esta tabla tiene más de 110 columnas y las consultas llevan mucho tiempo, especialmente cuando la mayoría del tiempo solo quiero ver <10 columnas.

Mi problema es que las consultas se generan dinámicamente en función de lo que el usuario quiere ver. Realmente no puedo crear diferentes asignaciones con diferentes columnas porque habría un gran número de combinaciones. Estoy usando la API de criterios para generar las consultas. ¿También puedo usar esto para seleccionar solo las columnas que el usuario quiere? ¿O algún otro método?

Gracias

Use una lista de ProjectionList para seleccionar las columnas que desea. Vea aquí para los ejemplos.

Fácil de hacer con LINQ (asumiendo que estás usando NHibernate 3.0 o posterior):

 var products = from p in Session.Query() where // ...some query (snip) select new { Name = p.ProductName, Description = p.ShortDesc, Price = p.Price, Units = p.Quantity }; 

Además, si está utilizando HQL, puede seleccionar las columnas que necesita de manera similar a usar T-SQL, pero usar un Transformer para recuperar un objeto fuertemente tipado:

Primero crea una clase con tus columnas reducidas:

 public class ProductReport { public string Name { get; set; } public string Description { get; set; } public decimal Price { get; set; } public int Units { get; set; } } 

Entonces su consulta:

 string hql = "select p.ProductName as Name, p.ShortDesc as Description ...(snip) " + "from Product p " + "where ...some query (snip)"; IQuery query = Session.CreateQuery(hql) .SetResultTransformer(Transformers.AliasToBean()); IList products = query.List(); 

Solo asegúrese de hacer que los alias en su consulta (como Nombre, como Descripción, etc.) coincidan con los nombres de propiedad en su clase.

Además del ejemplo que Tim te dio, puedes hacer algo como esto:

 IList selection = session.QueryOver() .Select( c => c.Name, c => c.Age) .List(); 

El ejemplo anterior se tomó de: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx