Many thanks Mohamed. I tried your recommendation and now I am seeing SQL queries with correct WHERE clauses. I learnt something new about Linq today - Expression v/s Func.
On Sep 22, 7:38 pm, Mohamed Meligy <[email protected]> wrote: > Sorry Manish and all, there is a small error in the above code. > > The 3rd line: > var query = Linq<Person>("person").Where( predicate ); > > Is not correct, Somehow I deleted the "Session." part in there. > Correct is: > var query = Session.Linq<Person>("person").Where( predicate ); > > The test function after correction: > > private void Test( Expression<Func<Person, bool>> predicate ) > { > var query = Session.Linq<Person>("person").Where( predicate ); > > var resultList = query.ToList(); > > Assert.That(resultList, > Has.All.AssignableTo(typeof(Person))); > } > > Sorry for that.. > > *Mohamed Meligy > *Readify | Senior Developer > > M:*+61 451 835006* | W: www.readify.net > > [image: Description: Description: Description: Description: > rss_16]<http://gurustop.net/> > [image: Description: Description: Description: Description: > cid:[email protected]] > <http://www.linkedin.com/in/meligy> [image: > Description: Description: Description: Description: > cid:[email protected]] <http://twitter.com/meligy> > > On Thu, Sep 23, 2010 at 12:35 AM, Mohamed Meligy <[email protected]>wrote: > > > @Manish. > > Let's say that Expression is the text that represents the function, and > > func is the function you get when you compile that text (over > > simplification). > > So, the difference is that when LINQ gets a text it can parse to extract > > the where part, it works, and if it finds a compiled function it gets the > > entire collection and brings every row to the function to check. > > > Hanselman write about it, although this is just the sense of it not the > > details: > > >http://www.hanselman.com/blog/TheWeeklySourceCode52YouKeepUsingThatLI... > > > Now, one more catch is how to use it. Unfortunately you cannot use it with > > the query syntax (the "from ... in ... where .. select .."). You have to use > > the LINQ methods. > > > Changing your example to use Expression:: > > > private void Test( Expression<Func<Person, bool>> predicate ) > > { > > var query = Linq<Person>("person").Where( predicate ); > > > var resultList = query.ToList(); > > > Assert.That(resultList, > > Has.All.AssignableTo(typeof(Person))); > > } > > > Side Note: > > The NHIbernare LINQ you are using (Recognized by seeing > > Session.Linq<...>()) is pretty old and no longer maintained. I advise you to > > the the LINQ provider in NHibernate itself. This is available in NHibernate > > 3.0 (which is pretty much backwards compatible with NHibernate 2.1.2 GA). > > You can either download the latest alpha or just the latest source code from > > SVN "trunk" folder. (yes, both are usually high quality, due to thousands of > > unit tests in there and also so many people using them in production, I'm > > one). Then you'll replace Session.Linq<>() with Session.Query(). > > Note that all mentioned about expression trees and LINQ pretty much applies > > to any LINQ provider, not just those of NHibernate. > > > Hope this helps. > > > Regards, > > > *Mohamed Meligy > > *Readify | Senior Developer > > > M:*+61 451 835006* | W: www.readify.net > > > [image: Description: Description: Description: Description: > > rss_16]<http://gurustop.net/> > > [image: Description: Description: Description: Description: > > cid:[email protected]] <http://www.linkedin.com/in/meligy> > > [image: > > Description: Description: Description: Description: > > cid:[email protected]] <http://twitter.com/meligy> > > > On Wed, Sep 22, 2010 at 9:32 PM, manish.in.microsoft < > > [email protected]> wrote: > > >> Thanks Oscar. > > >> I understood that NHibernate could not figure out that the predicate > >> was a lamdbda expression. If I change Func<Person, bool> to > >> Expression<Func<Person, bool>>, how will the Linq query change? I > >> believe I will no longer be able to use from ... where predicate(e) > >> select e? > > >> On Sep 22, 4:17 pm, Oskar Berggren <[email protected]> wrote: > >> > 2010/9/22 manish.in.microsoft <[email protected]>: > > >> > > I have a severe performance problem with Linq for NHibernate that I am > >> > > able to reproduce with the Linq for NHibernate unit test cases as > >> > > well. Consider the following test case: > > >> > > [TestFixture] > >> > > public class EntityNameTests : BaseTest > >> > > { > >> > > [Test] > >> > > public void CanQueryOnEntityName() > >> > > { > >> > > var query = (from e in session.Linq<Person>("person") > >> > > where e.Id == 1 > >> > > select e); > > >> > > var resultList = query.ToList(); > > >> > > Assert.That(resultList, > >> > > Has.All.AssignableTo(typeof(Person))); > >> > > } > >> > > } > > >> > > When I run this test case, I see the following database query being > >> > > fired: > > >> > > SELECT this_.Id as Id7_0_, this_.Name as Name7_0_ FROM Person this_ > >> > > WHERE this_.Id = @p0;@p0 = 1 > > >> > > This is expected. However, if I change the test case to: > > >> > > [TestFixture] > >> > > public class EntityNameTests : BaseTest > >> > > { > >> > > [Test] > >> > > public void CanQueryOnEntityName() > >> > > { > >> > > this.RunTest(e => e.Id == 1); > >> > > } > > >> > > private void Test(Func<Person, bool> predicate) > >> > > { > >> > > var query = (from e in session.Linq<Person>("person") > >> > > where predicate(e) > >> > > select e); > > >> > In this case, you are saying: > > >> > ... where SomeRandomFunctionCallThatMightDoWhateverItLikes(e) ... > > >> > NHibernate has no choice but to get everything and pass each item to > >> > the function. You need to use Expression<Func<T, bool>> instead. > > >> > /Oskar > > >> -- > >> You received this message because you are subscribed to the Google Groups > >> "nhusers" group. > >> To post to this group, send email to [email protected]. > >> To unsubscribe from this group, send email to > >> [email protected]<nhusers%[email protected]> > >> . > >> For more options, visit this group at > >>http://groups.google.com/group/nhusers?hl=en. -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
