Uso LINQ mucho en general, especialmente LINQ-to-Objects, por lo tanto, soy bastante fluido en LINQ.Linq a NHibernate frente a ICriteria
Estaba considerando utilizar LINQ-to-NHibernate como lenguaje de consulta para mi proyecto NHibernate. Cuando escribí algunas pruebas, noté que LINQ-to-NHibernate no hace la misma consulta que ICriteria. Dado que prefiero usar LINQ, me gustaría preguntar si alguien sabe de diferencias similares, o simplemente no me molesto por el rendimiento en general (las operaciones de alto rendimiento necesitarían algunos ajustes con NHibernate de todos modos en la medida en que obtengo eso). Véase el siguiente ejemplo:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project == project select inputItem).First();
me da el siguiente 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
mientras que
var criteria = session.CreateCriteria<InputItem>();
criteria.Add(Expression.Eq("Project", project));
criteria.SetMaxResults(1);
criteria.List();
da
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, el LEFT JOIN no sería necesario.
¿Algo está mal con mi consulta LINQ o es solo una limitación? ¿Y debería preocuparme por eso en primer lugar?
Icey
EDIT: He intentado cambiar la declaración de LINQ a lo siguiente:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project.ID == project.ID
select inputItem).First();
el SQL generado es el mismo, sin embargo.
Así que lo tomo, no cometí ningún error obvio. –