NHibernate:HqlGenerator:通过连接其他属性来创建计算属性

NHibernate:HqlGenerator:通过连接其他属性来创建计算属性,nhibernate,hql,linq-to-nhibernate,Nhibernate,Hql,Linq To Nhibernate,我正在尝试添加HqlGenerator,以允许NHibernate查询以下域实体上的计算属性: public class User { public string FirstName { get; set; } public string LastName {get; set; } public string FullName { get { return FirstName + " " + LastName; } } } 我创建了一个

我正在尝试添加HqlGenerator,以允许NHibernate查询以下域实体上的计算属性:

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"))
        );
    }
}
但是,稍后在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))), )]
有人能发现我做错了什么吗?

在BuildHQL()中,您多次包含子表达式“user”。这是不可能的。你需要使用

var user1 = visitor.Visit(expression).AsExpression();
var user2 = visitor.Visit(expression).AsExpression();
并在Concat表达式中使用其中的每一项

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