0

NHibernateが次のドメインエンティティの計算されたプロパティをクエリできるようにHqlGeneratorを追加しようとしています。

public class User 
{
    public string FirstName { get; set; }
    public string LastName {get; set; }
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
}

私は次のようなHQLジェネレーターを作成しました:

public class UserFullName : BaseHqlGeneratorForProperty
{
    public UserFullName()
    {
        var properties = new List<MemberInfo> { typeof(User).GetProperty("FullName") };
        SupportedProperties = properties;
    }

    public override HqlTreeNode BuildHql(MemberInfo member, Expression expression, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
    {
        var user = visitor.Visit(expression).AsExpression();
        return treeBuilder.Concat(
            treeBuilder.Dot(user, treeBuilder.Ident("FirstName")),
            treeBuilder.Constant(" "),
            treeBuilder.Dot(user, treeBuilder.Ident("LastName"))
        );
    }
}

BuildHqlクエリを実行するとデバッガーがメソッド内で中断するため、ジェネレーターは構成に正しく接続されています。

session.Query<User>().FirstOrDefault(x => x.FullName == "Aaron Janes");

ただし、後でNHibernate内部で例外がスローされます。

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException : Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. [.FirstOrDefault[User](NHibernate.Linq.NhQueryable`1[User], Quote((x, ) => (String.op_Equality(x.FullName, Aaron Janes))), )]

誰かが私が間違っていることを見つけることができますか?

4

1 に答える 1

2

BuildHQL()には、部分式'user'を複数回含めます。これは不可能です。あなたが使用する必要があります

var user1 = visitor.Visit(expression).AsExpression();
var user2 = visitor.Visit(expression).AsExpression();

そして、それらのそれぞれをConcat式で1回使用します。

于 2013-01-22T12:57:02.920 に答える