C# NHibernate查询中使用表达式的动态排序

C# NHibernate查询中使用表达式的动态排序,c#,nhibernate,expression,queryover,C#,Nhibernate,Expression,Queryover,给定以下QueryOver: UserProfile userProfileAlias = null; Pegfile pegfileAlias = null; var q = Session.QueryOver(() => pegfileAlias) .JoinAlias(() => pegfileAlias.UserProfile, () => userProfileAlias); 我想通过交换使下面的语句变得动态 q = q.OrderBy(() =&g

给定以下
QueryOver

UserProfile userProfileAlias = null;
Pegfile pegfileAlias = null;
var q = Session.QueryOver(() => pegfileAlias)
        .JoinAlias(() => pegfileAlias.UserProfile, () => userProfileAlias);
我想通过交换使下面的语句变得动态

q = q.OrderBy(() => userProfileAlias.Forename).Asc;
(OrderBy(表达式)或(
OrderBy(表达式)

我从另一个帖子借来的

private Expression<Func<object>> GetMemberExpression(UserProfile instance, string propertyName)
        {
            var arg = Expression.Constant(instance, typeof(UserProfile));
            var body = Expression.Convert(Expression.PropertyOrField(arg, propertyName), typeof(UserProfile));
            var lambda = Expression.Lambda<Func<object>>(body);
            return lambda;
        }
我想我可能需要匹配以下信号:

OrderBy(Expression<Func<UserProfile,object>>)
OrderBy(表达式)

如何将
GetMemberExpression
转换为返回该值?

您的版本不起作用的原因是,NHibernate实际上没有为
JoinAlias
中用作别名的变量赋值。它只是一个正在解析的标记。这意味着,如果需要,它需要是完全相同的变量在别处使用它。
要实现此目的,需要保存别名表达式并使用其主体检索该变量:

UserProfile alias = null;
Expression<Func<object>> aliasExpression = () => alias;
session.QueryOver<Pegfile>()
       .JoinAlias(x => x.UserProfiles, aliasExpression)
       .OrderBy(GetMemberExpression(aliasExpression, "Forename")).Asc
       .List();

private Expression<Func<object>> GetMemberExpression(
                                     Expression<Func<object>> aliasExpression,
                                     string property)
{
    var propertyExpression = Expression.Property(aliasExpression.Body,
                                                 typeof(UserProfile), property);
    var body = Expression.Convert(propertyExpression, typeof(object));

    var result = Expression.Lambda<Func<object>>(body);
    return result;
}
UserProfile别名=null;
表达式别名表达式=()=>别名;
session.QueryOver()
.JoinAlias(x=>x.UserProfiles,别名表达式)
.OrderBy(GetMemberExpression(别名表达式,“名字”)).Asc
.List();
私有表达式GetMemberExpression(
表达式别名表达式,
字符串属性)
{
var propertyExpression=Expression.Property(别名Expression.Body,
类型(用户配置文件),属性);
var body=Expression.Convert(propertyExpression,typeof(object));
var结果=表达式.Lambda(主体);
返回结果;
}
OrderBy(Expression<Func<UserProfile,object>>)
UserProfile alias = null;
Expression<Func<object>> aliasExpression = () => alias;
session.QueryOver<Pegfile>()
       .JoinAlias(x => x.UserProfiles, aliasExpression)
       .OrderBy(GetMemberExpression(aliasExpression, "Forename")).Asc
       .List();

private Expression<Func<object>> GetMemberExpression(
                                     Expression<Func<object>> aliasExpression,
                                     string property)
{
    var propertyExpression = Expression.Property(aliasExpression.Body,
                                                 typeof(UserProfile), property);
    var body = Expression.Convert(propertyExpression, typeof(object));

    var result = Expression.Lambda<Func<object>>(body);
    return result;
}