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))), )]
誰かが私が間違っていることを見つけることができますか?