2012-08-13 14 views
6

Ich Refactoring alten Stil Abfrage CreateCriteria() zu QueryOver(). Mein Wcf-Dienst erhält string PropertyName, um Abfrageergebnisse zu bestellen. Für IQueryable benutze ich Dynamic LINQ, um solche Bestellung zu tun, für CreateCriteria() - AddOrder().Nhibernate QueryOver. Sortierung nach String-Eigenschaftsnamen.

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

Irgendwelche Vorschläge, wie man im Fall mit Zeichenfolgeneigenschaftsnamen bestellt?

PS: LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception

Dank: Ich LINQ nicht Nhibernate verwenden könnte!

Antwort

12

können Sie immer die in Projections.Property(propName) direkt von der QueryOver API für 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

Danke. Ist es möglich, ICriteria zurück zu IQueryOver zu machen? –

+0

Ich denke nicht, was Sie tun könnten, ist dies in eine IQueryOver-Erweiterungsmethode umzuwandeln. Ich poste Beispiel ... – dotjoe

0

Sie die OrderBy einstellen, indem 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(); 

oder als Erweiterung Methode gehen, dass Beispiel:

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

Es gibt keine Möglichkeit zu s und die Richtung durch einen String, also müssen Sie ein einfaches if/else machen oder eine Erweiterungsmethode erstellen, um die API zu vereinfachen.

+0

.Desc Eigenschaft existiert nicht –