Я использую 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 то же самое, хотя.
Итак, я понимаю, я не сделал никакой очевидной ошибки. –