Linq do NHibernate vs. ICriteria

Używam LINQ bardzo często, zwłaszcza LINQ-to-Objects, dlatego jestem dość płynny w LINQ.

Rozważałem użycie LINQ-to-NHibernate jako języka zapytań dla mojego projektu NHibernate. Kiedy napisałem kilka testów, zauważyłem, że LINQ-to-NHibernate nie tworzy tego samego zapytania co ICriteria. Ponieważ wolałbym używać LINQ, chciałbym zapytać, czy ktoś wie o podobnych różnicach, czy też nie powinienem się przejmować ogólną wydajnością (operacje o wysokiej wydajności wymagałyby trochę poprawek w NHibernate, o ile dostanę to). Zobacz następujący przykład:

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

daje mi następujący 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

Najwyraźniej LEFT JOIN nie byłoby konieczne.

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

Icey

EDYTUJ: Próbowałem zmienić instrukcję LINQ na następujące:

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

wygenerowany SQL jest taki sam.

questionAnswers(2)

yourAnswerToTheQuestion