3

次の場合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>>または(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'.

私はおそらく次のsigに一致する必要があると思います:

OrderBy(Expression<Func<UserProfile,object>>)

GetMemberExpressionそれを返すように変える方法は?

4

1 に答える 1

4

お使いのバージョンが機能しない理由は、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;
}
于 2013-01-14T13:26:56.937 に答える