Take the 2-minute tour ×

I'm curious on how the NHibernate team has solved the QueryOver syntax, so that it works with intellisense and validation at compile time?

According to http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx they make use of extension methods and lambda expressions, but I've tried looking through the source but it doesn't really explains it fully to me.

How do they make them type safe, at compile time, without the need for any proxy classes that extends them?

I would like to "copy" this behavior but for that I need some basic understanding of the concept, any pointers to documentation on the subject is also welcome.

share|improve this question
I don't understand how proxy classes would fit in this context? –  Mauricio Scheffer Jul 28 '10 at 19:43
Well, I thought on how you can extend all Properties on a class with new operators, like ==, < etc, aswell as methods for Eq(), Gt(). –  jishi Jul 29 '10 at 8:51
add comment

1 Answer

up vote 4 down vote accepted

Much like any LINQ implementation, QueryOver uses Expression trees manipulation at runtime. In particular, see the ExpressionProcessor class, it has a dictionary that maps Expressions to functions that apply ICriteria.

QueryOver also uses fluent interface techniques. For example, when calling OrderBy it returns a IQueryOverOrderBuilder, which clearly defines what operations are available when ordering. Similarly, there's a IQueryOverRestrictionBuilder type that defines available methods on restrictions. This is in contrast to many simpler fluent interface implementations that always return this to allow method concatenation.

share|improve this answer
In case it's not clear enough, I'm not saying QueryOver is a LINQ provider implementation. –  Mauricio Scheffer Jul 28 '10 at 19:40
add comment

Your Answer


