gpt4 book ai didi

linq - NHibernate 3 - 扩展 Linq 提供者 BaseHqlGeneratorForMethod.BuildHql 问题

转载 作者:行者123 更新时间:2023-12-04 18:36:21 25 4
gpt4 key购买 nike

我想用我自己的方法扩展 NHibernate 3 的默认 LINQ 提供程序。我希望能够使用我的 POCO 中的一些方法。我有一个名为 Range 的组件,它在我的许多 POCO 中经常使用。这个 nhibernate 组件类有一个我想在 LINQ 查询表达式中使用的方法 Contains(int value)

映射:

<class name="Foo">
...
<component name="AgeRange">
<property name="Min" column="age_min" />
<property name="Max" column="age_max" />
</component>
</class>

类(class)
public class Range {
public int Min { get; set; }
public int Max { get; set; }

public bool Contains(int value) {
return value >= this.Min && value <= this.Max;
}
}

// this is the LINQ query I want to be able to write
// which will generate 'SELECT * FROM Foo WHERE 25 BETWEEN age_min AND age_max'
var s = from x in session.Query<Foo> where x.AgeRange.Contains(25) select x;

// I know the following works
var s = from x in session.Query<Foo> where x.AgeRange.Min <= 25 && x.AgeRange.Max >= 25 select x;

我查看了几篇博文,解释了如何扩展 LINQ 提供程序,但我不知道如何构建使其工作所需的表达式。
public class RangeContainsGenerator : BaseHqlGeneratorForMethod
{
public MemberInfo RangeMin;
public MemberInfo RangeMax;

public RangeContainsGenerator() {
SupportedMethods = new[] {
ReflectionHelper.GetMethodDefinition<Range>(x=> x.Contains(0)),
};

RangeMin = ReflectionHelper.GetProperty<Range, int>(x => x.Min);
RangeMax = ReflectionHelper.GetProperty<Range, int>(x => x.Max);
}

public override NHibernate.Hql.Ast.HqlTreeNode BuildHql(
System.Reflection.MethodInfo method,
System.Linq.Expressions.Expression targetObject,
System.Collections.ObjectModel.ReadOnlyCollection<System.Linq.Expressions.Expression> arguments,
NHibernate.Hql.Ast.HqlTreeBuilder treeBuilder,
NHibernate.Linq.Visitors.IHqlExpressionVisitor visitor) {
// The targetObject parameter contains the "Foo.AgeRange" member access expression
throw new NotImplementedException();
}
}

在 BuildHql 方法中,我不知道如何访问 Range 类的 Min 和 Max 属性来构建 HqlTreeNode

最佳答案

  • 您可以手动方法:最简单的方法是创建一个代表您想要的 LINQ 树:arguments[0] >= targetObject.Min && arguments[1] <= targetObject.Max .这里>=Expression.GreaterThenOrEqual , .Expression.Property等等。
    当您有表达式树时,只需应用 visitor并返回它返回的内容(我不记得确切的 API,但如果需要其他帮助,我可以查看它)。
  • 另一种解决方案可能是尝试我的小图书馆:Expressive .
    它尝试将方法 IL 转换为表达式,因此您可以执行 LinqToHqlGeneratorsRegistryIRuntimeMethodHqlGenerator试图内联任何未知的属性/方法。
  • 关于linq - NHibernate 3 - 扩展 Linq 提供者 BaseHqlGeneratorForMethod.BuildHql 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916122/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com