I know what you are talking about http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html
<http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html>take care with one consequence: *Using a Repository interpretation like the above there is another side effect: the responsibility of “how query the persistence” is completely delegated to the business-logic developer* * * The other is: long time ago gurues said that "write SQL hard-coded everywhere, is a really bad thing" To you the the difference with LINQ-to-Persistence out-side the repository The immortality of the Medusa is around the corner * * On Fri, Jun 25, 2010 at 7:19 AM, ben <[email protected]> wrote: > Hi Fabio, > > I'm using the repository pattern and try to keep my repositories > simple by exposing an IQueryable<T>. Then I have specific methods in > my service layer than use the IQueryable. > > This is the reason why i'm trying to avoid using HQL. > > Diego, > > Thanks for the confirmation > > > On Jun 24, 4:37 pm, Fabio Maulo <[email protected]> wrote: > > and about "magic strings"... put it in the mapping and NH'll compile it > at > > BuildSessionFactory and you don't have "magic strings" anymore. > > > > > > > > On Thu, Jun 24, 2010 at 12:34 PM, Fabio Maulo <[email protected]> > wrote: > > > btw... I don't know where you are generating the query... in general I > > > don't have such problems because I'm using HQL most of the times. > > > > > On Thu, Jun 24, 2010 at 12:24 PM, Diego Mijelshon < > [email protected]>wrote: > > > > >> session.Query<T> is new in 3.x, using the integrated Linq provider, > which > > >> is HQL-based instead of Criteria-based behind the scenes, allowing for > more > > >> flexibility. > > > > >> Diego > > > > >> On Thu, Jun 24, 2010 at 12:13, ben <[email protected]> wrote: > > > > >>> Fabio, > > > > >>> Is session.Query<T> new? > > > > >>> Using what you have with session.Linq<T>: > > > > >>> var query = from v in _session.Linq<Vehicle>() > > >>> where v.Carrier == > > >>> _session.Load<Carrier>(carrierId) > > >>> select v; > > > > >>> Generates the same sql as what I have in the my original Linq > example: > > > > >>> NHibernate: SELECT this_.Id as Id1_1_, this_.VehicleType as > > >>> VehicleT2_1_1_, this_.BusinessRef as Business3_1_1_, this_.CarrierId > > >>> as CarrierId1_1_, carrier1_.Id as Id2_0_, carrier1_.Name as Name2_0_, > > >>> carrier1_.BusinessRef as Business3_2_0_, carrier1_.Enabled as > > >>> Enabled2_0_ FROM Vehicles this_ left outer join Carriers carrier1_ on > > >>> this_.CarrierId=carrier1_.Id WHERE this_.CarrierId = @p0;@p0 = 1 > > > > >>> Thanks > > >>> Ben > > > > >>> On Jun 23, 12:38 pm, Fabio Maulo <[email protected]> wrote: > > >>> > from v in session.Query<Vehicle>() where v.Carrier == > > >>> > session.Load<Carrier>(1) select v > > > > >>> > On Wed, Jun 23, 2010 at 8:16 AM, ben <[email protected]> > wrote: > > >>> > > I've got a one to many association between a Carrier and Vehicle. > In > > >>> > > my database my Vehicle table has a foreign key CarrierId. > > > > >>> > > The most efficient way to query vehicles by carrier would be: > > > > >>> > > select ... from Vehicles where Vehicles.CarrierId == 1 > > > > >>> > > However, if I use QBC: > > > > >>> > > var fromDb = session.CreateCriteria<Vehicle>() > > >>> > > .CreateCriteria("Carrier", > > >>> > > global::NHibernate.SqlCommand.JoinType.InnerJoin) > > >>> > > .Add(Expression.Eq("Id", 1)) > > >>> > > .AddOrder(new Order("BusinessRef", true)) > > >>> > > .List<Vehicle>(); > > > > >>> > > The result is: > > > > >>> > > NHibernate: SELECT this_.Id as Id1_1_, this_.VehicleType as > > >>> > > VehicleT2_1_1_, this_.BusinessRef as Business3_1_1_, > this_.CarrierId > > >>> > > as CarrierId1_1_, carrier1_.Id as Id2_0_, carrier1_.Name as > Name2_0_, > > >>> > > carrier1_.BusinessRef as Business3_2_0_ FROM Vehicles this_ inner > > >>> join > > >>> > > Carriers carrier1_ on this_.CarrierId=carrier1_.Id WHERE > carrier1_.Id > > >>> > > = @p0 ORDER BY carrier1_.BusinessRef asc;@p0 = 1 > > > > >>> > > If I use NHibernate.Linq: > > > > >>> > > var fromDb2 = session.Linq<Vehicle>() > > >>> > > .Where(x => x.Carrier.Id == 1) > > >>> > > .OrderBy(x => x.BusinessRef) > > >>> > > .ToList(); > > > > >>> > > The result is similar but always seems to do an outer join (how > can I > > >>> > > force it to be left inner?): > > > > >>> > > NHibernate: SELECT this_.Id as Id1_1_, this_.VehicleType as > > >>> > > VehicleT2_1_1_, this_.BusinessRef as Business3_1_1_, > this_.CarrierId > > >>> > > as CarrierId1_1_, carrier1_.Id as Id2_0_, carrier1_.Name as > Name2_0_, > > >>> > > carrier1_.BusinessRef as Business3_2_0_ FROM Vehicles this_ left > > >>> outer > > >>> > > join Carriers carrier1_ on this_.CarrierId=carrier1_.Id WHERE > > >>> > > carrier1_.Id = @p0 ORDER BY this_.BusinessRef asc;@p0 = 1 > > > > >>> > > Finally if I use HQL (as much as I dislike using "magic" > strings), > > >>> the > > >>> > > result is exactly what I would expect and seems the most > efficient: > > > > >>> > > var fromDb3 = session.CreateQuery("from Vehicle > where > > >>> > > Carrier.Id = :id") > > >>> > > .SetParameter("id", 1) > > >>> > > .List<Vehicle>(); > > > > >>> > > NHibernate: select vehicle0_.Id as Id1_, vehicle0_.VehicleType as > > >>> > > VehicleT2_1_, vehicle0_.BusinessRef as Business3_1_, > > >>> > > vehicle0_.CarrierId as CarrierId1_ from Vehicles vehicle0_ where > > >>> > > vehicle0_.carrier...@p0;@p0 = 1 > > > > >>> > > So why do I get this difference and more importantly, how can I > use > > >>> > > QBC or Linq to generate the same SQL as HQL does? > > > > >>> > > Thanks, > > >>> > > Ben > > > > >>> > > -- > > >>> > > 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]> > <nhusers%[email protected]<nhusers%[email protected]> > > > > >>> <nhusers%[email protected]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]> > > > > > > >>> > > . > > >>> > > For more options, visit this group at > > >>> > >http://groups.google.com/group/nhusers?hl=en. > > > > >>> > -- > > >>> > Fabio Maulo > > > > >>> -- > > >>> 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]> > <nhusers%[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]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]> > > > > >> . > > >> For more options, visit this group at > > >>http://groups.google.com/group/nhusers?hl=en. > > > > > -- > > > Fabio Maulo > > > > -- > > Fabio Maulo > > -- > 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. > > -- Fabio Maulo -- 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.
