2012-08-13 15 views
6

Sto rifattando la query vecchio stile CreateCriteria() a QueryOver(). Il servizio My Wcf riceve string PropertyName per ordinare risultati di query. Per IQueryable Io uso Dynamic LINQ per fare questo ordinamento, per CreateCriteria() - AddOrder().Nhibere QueryOver. Ordine usando i nomi delle proprietà delle stringhe.

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[]>(); 

Qualche suggerimento su come eseguire l'ordine in caso di nomi di stringhe?

PS: non ho potuto usare LINQ to NHibernate: LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

Grazie!

risposta

12

Si può sempre ottenere il 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 come un metodo di estensione per 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

Grazie. È possibile riportare ICriteria su IQueryOver? –

+0

Io non la penso così, quello che potresti fare è refactoring in un metodo di estensione IQueryOver. Pubblicherò un esempio ... – dotjoe

0

È possibile impostare l'OrderBy direttamente dalle API QueryOver passando Projections.Property(propName), per esempio:

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

Non c'è modo di s et the direction by a string, quindi dovrai fare un semplice if/else o creare un metodo di estensione per semplificare l'API.

+0

La proprietà .Desc non esiste –

Problemi correlati