对于我正在开发的项目,我必须使用 Linq 来创建一些规范。现在我有一个字典,我必须在上面搜索值。由于 NHibernate 的默认 Linq 实现不支持 ContainsValue 函数,因此我决定创建自己的。
所以我创建了一个名为 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 方法实现。Hqls 语法与 ContainsKey 语法非常相似。唯一需要改变的(我猜)是,我必须使用 treebuilder.Elements(在评论中显示)而不是 treebuilder.Indices()。
这就是我卡住的地方;我无法为 ElementsExpression 提供我自己的字典。如何创建一个利用 Elements 表达式的 HqlTreeNode?
在此先感谢,罗布范帕梅尔