2009-07-31 2 views
5

Я использую LINQ много в общем, особенно LINQ-to-Objects, поэтому я довольно свободно владею LINQ.Linq to NHibernate vs. ICriteria

Я планировал использовать LINQ-to-NHibernate в качестве языка запросов для моего проекта NHibernate. Когда я написал несколько тестов, я заметил, что LINQ-to-NHibernate не делает тот же запрос, что и ICriteria. Поскольку я бы предпочел использовать LINQ, я бы хотел спросить, знает ли кто-нибудь о подобных различиях, или я просто не буду беспокоиться о производительности в целом (высокопроизводительные операции нуждаются в некоторой настройке с NHibernate в любом случае, насколько я могу получить Это). Смотрите следующий пример:

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

дает мне следующий 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 

тогда

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

дает

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 

Очевидно, что LEFT JOIN не будет необходимо.

Что-то не так с моим запросом LINQ или это просто ограничение? И я должен беспокоиться об этом в первую очередь?

Icey

EDIT: Я попытался изменить заявление LINQ к следующему:

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

сгенерированный SQL то же самое, хотя.

ответ

1

Мне кажется, что NHibernate.Linq не поддерживает эту оптимизацию прямо сейчас. Я думаю, вам нужно будет использовать запрос критериев или HQL или ждать, пока полностью не будет интегрирован поставщик LINQ (для NHib v3 я думаю).

Cheers, Джон

+0

Итак, я понимаю, я не сделал никакой очевидной ошибки. –

0

Вы используете latest release?

Мне еще предстоит попробовать. Но я должен сказать, что я всегда сталкиваюсь с проблемами при попытке использовать Linq-to-NHibernate. Ну, может быть, я слишком много новичок для них обоих ... но Linq должен быть интуитивным, и нет ничего интуитивного в получении нулевой ссылки из проклятого простого запроса (например, вашего), который отлично работает в HQL.

Но это понятно, так как это было в разработке. И все же, я полагаю ;-)

+1

Да, я использую версию 1.0 из Linq-на-NHibernate. Кстати, я не получаю нулевые ссылки. Единственное место, где вы могли бы получить исключение с нулевой ссылкой, было бы первым() в конце. Попробуйте использовать FirstOrDefault(). И я бы хотел пропустить HQL, потому что я искренне ненавижу магические струны, где бы они ни были во избежание. –

Смежные вопросы