2009-07-31 11 views
5

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.

Respuesta

1

Me parece que NHibernate.Linq no es compatible con esta optimización en este momento. Creo que tendrá que usar una consulta de criterios, o HQL, o esperar hasta que se libere el proveedor LINQ completamente integrado (creo que para NHib v3).

Cheers, John

+0

Así que lo tomo, no cometí ningún error obvio. –

0

¿Usas el latest release?

Todavía tengo que probarlo yo mismo. Pero tengo que decir que siempre encuentro problemas cuando trato de usar Linq-to-NHibernate. Bueno, tal vez soy demasiado novato para los dos ... pero se supone que Linq es intuitivo, y no hay nada intuitivo en obtener referencias nulas de una consulta muy simple (como la suya) que funciona perfectamente en HQL.

Pero es comprensible ya que estaba en desarrollo. Y todavía lo es, supongo ;-)

+1

Sí, yo uso la versión 1.0 de LINQ to NHibernate. Por cierto, no obtengo referencias nulas. El único lugar donde podría obtener una excepción de referencia nula aquí sería First() al final. Intenta usar FirstOrDefault(). Y me gustaría omitir HQL ya que odio sinceramente las cadenas de magia donde sea que se puedan evitar. –

Cuestiones relacionadas