It would be nice to see a 3.5 release of NH with this kind of syntax out the 
box.

I was originally planning on adding an ICriteria<T> (and DetachedCriteria<T>) 
to the extensions project.  The only reason I avoided it in the first release 
was because the associations can't enforce the type correctly (that I can see) 
...

session.CreateCriteria<Person>()
    .CreateCriteria<ChildrenTypeMustGoHere>(p => p.Children) // nothing to 
prevent wrong type
        .Add(c => c.ChildName == "foo")
                    ...

I might still look at adding it if it's going to be a while before an NH 3.5 
release.  (Obviously if you're gonna have this in a NH 3.5 release soon then 
the extensions project will become obsolete anyway.)


In addition, as much as I love the idea of LINQ, I think it might help people 
to be aware of how to sort problems like locking, and select n+1, with a LINQ 
provider.

 
From: Stephen Bohlen 
Sent: Thursday, January 08, 2009 12:00 PM
To: [email protected] 
Subject: [nhibernate-development] Re: Type safe criteria


First, I'm all for this.  Over the recent past, others (including myself) have 
tinkered with variations on just such an approach...

http://www.kowitz.net/archive/2008/08/17/what-would-nhibernate-icriteria-look-like-in-.net-3.5.aspx

http://bugsquash.blogspot.com/2008/03/strongly-typed-nhibernate-criteria-with.html

http://unhandled-exceptions.com/blog/index.php/2008/11/22/the-continuing-quest-for-death-of-string-literals-in-my-code/

...with some of us going farther than others (e.g., my musing never lead to 
anything fully-featured, but instead just languished as a quick spike on my HD).

It sort of seems to me like there are two (largely orthogonal) concerns here:

1) remove the dependence on string-literals in ICriterion queries

2) LINQ provider for NH

#1 is IMHO an entirely worthwhile goal in its own right -- clearly the less 
magic, refactor-proof strings there are the better off we all are.  I would 
guess that there are some issues with how this would find its way into the NH 
trunk since presently NH 2.1 has a publicly-stated desire to continue to target 
Fx 2.0 and we need Fx 3.x for lambda support AFAIK (an implementation detail 
that could be solved by introducing some kind of NH3xExtensions.dll assembly or 
something similar to that, so not a deal-breaker by any means of course but 
rather just an acknowledgement of some add'l complexity).

But as for #2, to me this gets to the heart of WHY people would want a LINQ 
provider -- if its to get intellisense during the construction of queries, then 
I think this would definitely help alleviate some of that pressure as you 
suggest.  But if its so that people already familiar with LINQ can move 
laterally from their present DAL-of-choice to NH, then I don't entirely see how 
this would help reduce that pressure (since knowing LINQ wouldn't ease the 
coming-to-NH learning curve).

Maybe its worth re-evaluating WHERE the frequent requests for LINQ support are 
coming from to try to futher investigate their 'motives/goals' which might help 
us better understand the relative value of this 'alternate' approach...?  Is is 
people who ALREADY know NH and are looking for a more refactor-friendly way to 
construct queries or is it from non-NH-users who are looking to flatten their 
learning curve when approaching NH?  Or is it from present NH-users who are 
looking to spread it to the rest of their team/company/whatever and are 
considering that LINQ2NH would make that process easier --?  If we knew better 
their goals, we might be better able to evaluate the effectiveness of pursuing 
this 'intermediate' step.

FWIW, I would consider that this is (or something very much like it) would be a 
valuable introduction to NH regardless of whether it materially reduces the 
calls for a complete LINQ2NH provider -- clearly its something that myself and 
others (including the initially-referenced poster) have been thinking about for 
some time.

Other thoughts?

-Steve B.

 
On Thu, Jan 8, 2009 at 4:52 AM, Ayende Rahien <[email protected]> wrote:

  This is really interesting:

  
http://nhforge.org/blogs/nhibernate/archive/2009/01/07/typesafe-icriteria-using-lambda-expressions.aspx

  Expanding the syntax a bit, we can use:

  session.CreateCriteria<Person>()
          .SetFetchMode(p => p.PersonDetail, FetchMode.Eager)
          .SetLockMode(LockMode.Upgrade)
          .Add(p=>p.Name.Like("foo"))
          .List();

  That would remove a lot of the pressure to build a full fledged linq provider.
  And it seems like it is much easier to do.

  Thoughts?

Reply via email to