對於我正在開發的項目,我必須使用Linq創建一些規範。現在我有一個字典,我必須在其中搜索值。由於NHibernate的默認Linq實現不支持ContainsValue函數,因此我決定創建自己的。Linq到Nhibernate:帶有元素的HqlTreeBuilder如何使用?
所以我創建了一個名爲ContainsValueGenerator類從BaseHqlGeneratorForMethod推導如下:
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?
由於提前, Rob範Pamel