I want to extend the default LINQ provider for NHibernate 3 using my own. I want to use some methods from my POCOs. I have a Range component that is used quite often in many of my POCOs. This nhibernate component class has a Contains (int value) method that I want to use in LINQ query expressions
Mapping:
<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; } }
I looked at a few blog posts explaining how to extend the LINQ provider, but I don't know how to create the expressions needed for this.
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) {
In the BuildHql method, I don't know how to access the Min and Max properties of my Range class to create an HqlTreeNode
Vasea source share