2011-05-24 8 views
6

Tengo una asignación de tabla de una clase a una; desafortunadamente esta tabla tiene más de 110 columnas, y las consultas toman un largo proceso, especialmente cuando la mayoría de las veces solo quiero ver < 10 columnas.¿Cómo seleccionar solo unas pocas columnas en mi consulta de NHibernate?

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 una gran cantidad de combinaciones. Estoy usando la API de criterios para generar las consultas. ¿Puedo usar esto para seleccionar solo las columnas que quiere el usuario? ¿O algún otro método?

Gracias

+12

lo que has dicho 110 columnas? ¡de vuelta al tablero de dibujo! – V4Vendetta

+1

@ V4Vendetta "¿Qué? ¿Rediseñar mi preciosa base de datos? ¡Pasé años perfeccionando su estructura y nadie me dirá qué hacer con ella!" (c) Su cliente ... – Spook

Respuesta

3

Utilice un ProjectionList para seleccionar las columnas que desee. See here para los ejemplos.

+7

Si el enlace muere, la respuesta es inútil. Incluya un fragmento pequeño pero esencial junto con enlaces ... –

9

fácil de hacer con LINQ (asumiendo que usted está utilizando NHibernate 3.0 o posterior):

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

Además, si usted está utilizando HQL, sólo puede seleccionar las columnas que necesita similar al uso de T- SQL, pero el uso de un Transformer para obtener un objeto fuertemente tipado vuelta:

en primer lugar crear una clase con sus columnas reducido:

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<ProductReport>()); 

IList<ProductReport> products = query.List<ProductReport>(); 

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

+0

No ayuda cuando tengo más de 100 columnas/propiedades posibles con cualquier combinación. Gracias de cualquier manera. – Harry

Cuestiones relacionadas