作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用我自己的方法扩展 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>
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;
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();
}
}
最佳答案
arguments[0] >= targetObject.Min && arguments[1] <= targetObject.Max
.这里>=
是 Expression.GreaterThenOrEqual
, .
是 Expression.Property
等等。visitor
并返回它返回的内容(我不记得确切的 API,但如果需要其他帮助,我可以查看它)。LinqToHqlGeneratorsRegistry
或 IRuntimeMethodHqlGenerator
试图内联任何未知的属性/方法。关于linq - NHibernate 3 - 扩展 Linq 提供者 BaseHqlGeneratorForMethod.BuildHql 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916122/
我想用我自己的方法扩展 NHibernate 3 的默认 LINQ 提供程序。我希望能够使用我的 POCO 中的一些方法。我有一个名为 Range 的组件,它在我的许多 POCO 中经常使用。这个 n
我是一名优秀的程序员,十分优秀!