Linq para NHibernate vs. ICriteria
Eu uso muito o LINQ em geral, especialmente o LINQ-to-Objects, portanto, sou bastante fluente no LINQ.
Eu estava pensando em usar o LINQ-to-NHibernate como a linguagem de consulta para o meu projeto NHibernate. Quando escrevi alguns testes, notei que o LINQ to NHibernate não faz a mesma consulta que o ICriteria. Desde que eu prefiro usar o LINQ, eu gostaria de perguntar se alguém sabe de diferenças semelhantes, ou eu deveria apenas não se preocupar com o desempenho em geral (as operações de alto desempenho precisariam de alguns ajustes com o NHibernate de qualquer maneira isto). Veja o seguinte exemplo:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project == project select inputItem).First();
me dá o seguinte 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
enquanto que
var criteria = session.CreateCriteria<InputItem>();
criteria.Add(Expression.Eq("Project", project));
criteria.SetMaxResults(1);
criteria.List();
dá
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
Claramente, o LEFT JOIN não seria necessário.
Há algo errado com minha consulta LINQ ou é apenas uma limitação? E eu deveria me preocupar com isso em primeiro lugar?
Icey
EDIT: eu tentei alterar a instrução LINQ para o seguinte:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project.ID == project.ID
select inputItem).First();
o SQL gerado é o mesmo, no entanto.