私が開発しているプロジェクトでは、Linqを使用していくつかの仕様を作成する必要があります。今私は値を検索しなければならない辞書があります。 NHibernateのデフォルトのLinq実装はContainsValue関数をサポートしていないので、自分で作成することにしました。LinqにNhibernateするには:HqlTreeBuilder with Elementsどのように使用するのですか?
だから私は、次のように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を提供することはできません。 要素式を利用するHqlTreeNodeを作成するにはどうすればよいですか?事前に
おかげで、 ロブ・ヴァン・Pamel