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;
}