Nhibernate QueryOver.OrderBy使用字符串属性名称.

Iev*_*nov 7 nhibernate nhibernate-criteria queryover

我重构旧式查询CreateCriteria()QueryOver().我的Wcf服务获取string PropertyName订单查询结果.对于IQueryable我使用动态LINQ做这样的排序,为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[]>();
Run Code Online (Sandbox Code Playgroud)

有关字符串属性名称如何排序的任何建议?

PS:我无法使用LINQ到Nhibernate:LINQ to NHibernate - .GroupBy().Skip().Take()导致异常

谢谢!

dot*_*joe 13

你总能得到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();
Run Code Online (Sandbox Code Playgroud)

或作为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;
}
Run Code Online (Sandbox Code Playgroud)