在NHibernate QueryOver中使用表达式进行动态排序
本文关键字:动态 排序 表达式 NHibernate QueryOver | 更新日期: 2023-09-27 17:52:47
给定以下QueryOver
:
UserProfile userProfileAlias = null;
Pegfile pegfileAlias = null;
var q = Session.QueryOver(() => pegfileAlias)
.JoinAlias(() => pegfileAlias.UserProfile, () => userProfileAlias);
我想通过交换
使下面的语句动态q = q.OrderBy(() => userProfileAlias.Forename).Asc;
(OrderBy(Expression<Func<object>>
or (OrderBy(Expression<Func<T, object>>)
)
q = q.OrderBy(GetMemberExpression(userProfileAlias, "Forename")).Asc;
我从另一个帖子借来的
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;
}
但是这不起作用,我得到:
System.InvalidOperationException
No coercion operator is defined between types 'System.String' and 'Pegfect.Domain.PegDudes.UserProfile'.
我想我可能需要匹配以下签名:
OrderBy(Expression<Func<UserProfile,object>>)
如何把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;
}