I'm refactoring old-style query CreateCriteria()
to QueryOver()
. My Wcf service gets string PropertyName
to order queries results. For IQueryable
I use Dynamic LINQ to do such 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 how to do ordering in case with string property names?
PS: I could not use LINQ to Nhibernate: LINQ to NHibernate - .GroupBy().Skip().Take() cause an exception
Thanks!
You can always get the 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;
}
You can set the OrderBy directly from the QueryOver API by passing in Projections.Property(propName)
, for example:
var query = GetSession()
.QueryOver<Activity>()
.OrderBy(Projections.Property("ActivityCount").Desc;
There is no way to set the direction by a string, so you'll have to do a simple if/else or create an extension method to simplify the API.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With