Линк в NHibernate против ICriteria - PullRequest
5 голосов
/ 31 июля 2009

В целом я часто использую LINQ, особенно LINQ-to-Objects, поэтому я довольно свободно владею LINQ.

Я собирался использовать 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();

1012 * дает *

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

Очевидно, что ЛЕВОЕ СОЕДИНЕНИЕ не понадобится.

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

Icey

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

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

сгенерированный SQL такой же.

Ответы [ 2 ]

1 голос
/ 11 августа 2009

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

Ура, John

0 голосов
/ 04 августа 2009

Используете ли вы последний выпуск ?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...