私が開発中のプロジェクトでは、Linq を使用していくつかの仕様を作成する必要があります。これで、値を検索する必要がある Dictionary ができました。NHibernate のデフォルトの Linq 実装は、ContainsValue 関数をサポートしていないため、独自の実装を作成することにしました。
そこで、次のように BaseHqlGeneratorForMethod から派生した ContainsValueGenerator という名前のクラスを作成しました。
public class ContainsValueGenerator : BaseHqlGeneratorForMethod
{
public ContainsValueGenerator()
{
SupportedMethods = new[] { ReflectionHelper.GetMethodDefinition(() => new Dictionary<object, object>().ContainsValue(null)) };
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
//Session.CreateQuery("from Message m where 'aDictionaryValue' in elements(m.Dictionary)");
HqlTreeNode hqlTreeNode = treeBuilder.Elements(); // TODO include dictionary here?
return treeBuilder.In(visitor.Visit(arguments[0]).AsExpression(), hqlTreeNode);
//return treeBuilder.In(visitor.Visit(arguments[0]).AsExpression(), treeBuilder.Indices(visitor.Visit(targetObject).AsExpression())); ContainsKey Method implementation
}
}
Nhibernate のソース コードを調べて、ContainsKey メソッドの実装を取り上げました。Hqlsyntax は、ContainsKey 構文と非常によく似ています。変更する必要がある唯一のこと (推測) は、treebuilder.Indices() の代わりに、treebuilder.Elements (コメントに表示) を使用する必要があることです。
それが私が立ち往生しているところです。ElementsExpression に独自の Dictionary を提供することはできません。Elements 式を利用する HqlTreeNode を作成するにはどうすればよいですか?
前もって感謝します、 ロブ・ヴァン・パメル