2009-07-31 14 views
5

Używam LINQ ogólnie, szczególnie LINQ-to-Objects, więc jestem raczej biegły w LINQ.Linq do NHibernate vs. ICriteria

Rozważałem użycie LINQ-do-NHibernate jako języka zapytań dla mojego projektu NHibernate. Kiedy napisałem kilka testów, zauważyłem, że LINQ-to-NHibernate nie robi tego samego zapytania co ICriteria. Ponieważ wolałbym używać LINQ, chciałbym zapytać, czy ktoś wie o podobnych różnicach, czy też po prostu nie powinienem zajmować się ogólną wydajnością (te wysoce wydajne operacje wymagałyby pewnych ulepszeń z NHibernate tak daleko, jak tylko dostaję to). Zobacz poniższy przykład:

var query = (from inputItem in session.Linq<InputItem>() 
      where inputItem.Project == project select inputItem).First(); 

daje mi następujące SQL:

SELECT this_.ID as ID0_1_, this_.Name as Name0_1_, this_.Project_id as Project3_0_1_, project1_.ID as ID1_0_, project1_.Name as Name1_0_ 
    FROM "InputItem" this_ left outer join "Project" project1_ on this_.Project_id=project1_.ID 
    WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1 

natomiast

var criteria = session.CreateCriteria<InputItem>(); 
criteria.Add(Expression.Eq("Project", project)); 
criteria.SetMaxResults(1); 
criteria.List(); 

daje

SELECT this_.ID as ID0_0_, this_.Name as Name0_0_, this_.Project_id as Project3_0_0_ 
    FROM "InputItem" this_ 
    WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1 

Oczywiście, LEFT JOIN nie będzie niezbędny.

Czy coś jest nie tak z moim zapytaniem LINQ, czy jest to tylko ograniczenie? I czy powinienem się tym przejmować?

Icey

EDIT: Próbowałem zmieniając oświadczenie LINQ do następujących:

var query = (from inputItem in session.Linq<InputItem>() 
      where inputItem.Project.ID == project.ID 
      select inputItem).First(); 

wygenerowany SQL jest taka sama, choć.

Odpowiedz

1

Wygląda na to, że NHibernate.Linq nie obsługuje teraz tej optymalizacji. Myślę, że będziesz musiał użyć kwerendy kryterialnej lub HQL, lub poczekać, aż zostanie wydany w pełni zintegrowany dostawca LINQ (myślę, że jest to planowane na NHib v3).

Cheers, John

+0

Więc biorę to, nie popełniłem żadnego oczywistego błędu. –

0

Czy używasz latest release?

Muszę jeszcze spróbować. Ale muszę powiedzieć, że zawsze wpadam na problemy przy próbie użycia Linq-do-NHibernate. Cóż, może jestem dla nich obojga nowicjuszem ... ale Linq ma być intuicyjny i nie ma nic intuicyjnego w uzyskaniu zerowego odniesienia z cholernie prostej kwerendy (takiej jak twoja), która działa doskonale w HQL.

Ale jest zrozumiałe, ponieważ był w fazie rozwoju. I nadal jest, jak sądzę ;-)

+1

Tak, używam wersji 1.0 z LINQ-NHibernate. Btw, nie dostaję pustych referencji. Jedynym miejscem, w którym możesz uzyskać zerowy wyjątek odwołania, będzie First() na końcu. Spróbuj użyć FirstOrDefault(). I chciałbym pomijać HQL, ponieważ szczerze nienawidzę magicznych ciągów wszędzie tam, gdzie są one do uniknięcia. –

Powiązane problemy