views:

103

answers:

1

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.

+2  A: 

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.

Mauricio Scheffer
In case it's not clear enough, I'm *not* saying QueryOver is a LINQ provider implementation.
Mauricio Scheffer