Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NHibernate3 Query vs QueryOver [duplicate]

Tags:

c#

orm

nhibernate

I noticed there are two ways to create nice generic friendly access to nhibernate.

IQueryOver<T, T> query= session.QueryOver<T>().Where(criteria);

and

IQueryable<T> query= session.Query<T>().Where(criteria);

Implementations of each interface.

IQueryOver<TRoot, TSubType> : IQueryOver<TRoot>, IQueryOver

and

IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable

IQueryable implements IEnumerable, thus supports all the LINQ friendly things you would expect. I am tending towards this implementation, but was wondering if anyone knew what the purpose of QueryOver was that you cannot accomplish with Query?

like image 949
Ty. Avatar asked Mar 16 '11 16:03

Ty.


2 Answers

QueryOver combines extension methods and lambda expressions:

IList<Cat> cats =
    session.QueryOver<Cat>()
        .Where(c => c.Name == "Max")
        .List();

QueryOver is a strongly-typed querying technology built on top of NHibernate’s Criteria API.

You can read more info here and here.

As far as I know some features in the linq provider are not implemented yet.
I would use QueryOver.
It allows you to write elegant code and it is fully featured.

Something worth reading.

like image 63
LeftyX Avatar answered Oct 02 '22 13:10

LeftyX


QueryOver syntax is NHibernate specific, thus it has many powerful methods that you just can't match in LINQ.

As LeftyX said, the LINQ implementation for NH is not complete, and I've had several headaches with it. For example, recently I had problems using the 2nd level cache, the Future values, and NH Spatial extensions with LINQ, all due to an incomplete implementation or bugs (and not mentioning the performance of some generated SQL, which is sometimes pretty awful).

In all these cases I had to use QueryOver, and after surpassing the learning-curve, is has, IMHO, a much nicer syntax than LINQ.

But LINQ via Query also has advantages; like being ORM agnostic (which might leverage a cleaner repository architecture), and for simple queries it is more than enough.

like image 43
psousa Avatar answered Oct 02 '22 11:10

psousa