Nhibernate QueryOver. OrderBy using string property names.

I am refactoring the old style CreateCriteria() to QueryOver() . The Wcf service receives a string PropertyName for ordering requests. For IQueryable I use Dynamic LINQ for such an ordering, for CreateCriteria() - AddOrder() .

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

Any suggestions on how to place an order in case of line name names?

PS: I could not use LINQ to Nhibernate: LINQ to NHibernate -.GroupBy (). Skip (). Take () raise an exception

Thanks!

+6
source share
2 answers

You can always get 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(); 

or as an extension method for 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; } 
+12
source

You can set OrderBy directly from the QueryOver API by going to Projections.Property(propName) , for example:

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

There is no way to specify the direction of the lines, so you will need to make a simple if / else or create an extension method to simplify the API.

0
source

Source: https://habr.com/ru/post/922731/


All Articles