2012-08-13 14 views
6

Estoy refactorizando la consulta de estilo antiguo CreateCriteria() a QueryOver(). Mi servicio Wcf obtiene string PropertyName para solicitar resultados de consultas. Para IQueryable utilizo Dynamic LINQ para hacer dicho pedido, para CreateCriteria() - AddOrder().Nhibernate QueryOver. PedidoPor usar cadenas de nombres de propiedades.

IList<object[]> result = 
      GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ) 
       .OrderByAlias("ActivityCount") // Compilation Error - I need such extension method 
       .List<object[]>(); 

¿Alguna sugerencia de cómo hacer un pedido en caso de cadena de nombres de propiedades?

PS: No podría utilizar LINQ a Nhibernate: LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

Gracias!

Respuesta

12

Siempre se puede obtener el UnderlyingCriteria ...

var q = GetSession() 
       .QueryOver(() => activity) 
       .JoinAlias(() => activity.ActivityLicense,() => license) 
       .Select(Projections.ProjectionList() 
          .Add(Projections.Count<Activity>(e => e.Id), "ActivityCount") 
          .Add(Projections.Group(() => license.SerialNumber), "SerialNumber") 
          .Add(Projections.Count<Activity>(e => e.MacAdress), "MacAddressCount") 
          .Add(Projections.Count<Activity>(e => e.IpAdress), "IpAddressCount") 
       ); 


q.UnderlyingCriteria.AddOrder(new Order("ActivityCount", true)); 

var results = q.List(); 

o como un método de extensión para IQueryOver

public static IQueryOver<T,T> OrderByAlias(this IQueryOver<T,T> q, string aliasName, bool ascending) 
{ 
    q.UnderlyingCriteria.AddOrder(new Order(aliasName, ascending)); 
    return q; 
} 
+0

Gracias. ¿Es posible volver ICriteria a IQueryOver? –

+0

No lo creo, lo que podría hacer es refactorizar eso en un método de extensión IQueryOver. Voy a publicar un ejemplo ... – dotjoe

0

Puede configurar el OrdenarPor directamente desde la API QueryOver pasando en Projections.Property(propName), por ejemplo:

var query = GetSession() 
       .QueryOver<Activity>() 
       .OrderBy(Projections.Property("ActivityCount").Desc; 

No hay forma de que s y la dirección con una cadena, por lo que tendrás que hacer un simple if/else o crear un método de extensión para simplificar la API.

+0

. La propiedad .Desc no existe –

Cuestiones relacionadas