2010-09-23 12 views

Respuesta

18

Puedes consultar LINQ for NHibernate ejemplos para ver las pruebas hechas por Ayende mismo sobre lo que está implementado y lo que no es para este proveedor.

Algunos de los general apoyado:

  • Anónimo creación tipo. new { Person = x.Name }
  • Primero(). query.First()
  • FirstOrDefault(). query.FirstOrDefault()
  • Solo(). query.Single()
  • SingleOrDefault(). query.SingleOrDefault()
  • Agregado(). query.Aggregate((x1,x2) => x1)
  • Contains(). query.Where(x => x.Name.Contains("Foo"))
  • StartsWith().
  • EndsWith().
  • Subcadena(). where db.Methods.Substring(e.FirstName, 1, 2) == "An"
  • Subconsultas. query.Where(x => x.Company.Id == 4)
  • Cuenta(). query.Where(x => x.Relatives.Count > 0)
  • Cualquiera().query.Any()
  • Take(). query.Take(10)
  • Saltar(). query.Take(10).Skip(4)
  • OrderBy(). orderby x.Name descending
  • Reemplazar(). AfterMethod = e.FirstName.Replace("An", "Zan"),
  • CharIndex(). where db.Methods.CharIndex(e.FirstName, 'A') == 1
  • IndexOf(). where e.FirstName.IndexOf("An") == 1

Problemática:

  • Grupo de
  • se une a

Una de mis propios ejemplos:

query = NSession.Session.Linq<Catalog>() 
      .Where(acc => acc.Company.Status == "A") 
     .Where(acc => acc.Id.StartsWith("12-536")) 
     .Where(acc => acc.Id.EndsWith("92") || acc.Id.EndsWith("67")) 
     .Take(10).OrderBy(acc => acc.Title); 

Si estás aplicación de producción está utilizando la última estable build 2.1.2.4 como yo, estás atascados con lo que el proveedor NHibernate.Linq nos brinda hasta que NHibernate 3.0 (trunk) obtiene una versión estable y nos sentimos lo suficientemente seguros como para usarlo en las principales aplicaciones. Hasta entonces, estoy más que feliz con una mezcla de NHibernate.Linq y HQL.

+1

¡Buena respuesta + voto! Tenga en cuenta que NHibernate trunk es estable para todas las funciones implementadas en la versión anterior. Los problemas son algunos problemas antiguos y problemas en las nuevas funciones. El proveedor de linq en el trunk es más estable que el otro. Mucha gente usa el trunk para ejecutar aplicaciones importantes. – Paco

+0

La versión estable parece ser compatible con todos los agregados. Por ejemplo, uso MAX y se traduce hasta el DB y se ejecuta allí. Tenga en cuenta que hay un pequeño error con las comparaciones de cadenas si está usando VB.NET. Lo descubrí por el camino difícil. Simplemente use myStr.Equals ("foo") en lugar de mystr = "foo" y funciona bien. No es un problema si usas C#. – Bytemaster

+0

@Paco: es bueno saberlo. Intentaré mover una de mis aplicaciones a NH trunk y veré cómo funciona (en un entorno de prueba, por supuesto). – rebelliard

3

La prueba básica de si NHibernate puede funcionar con una declaración Linq es si puede serializar el árbol de expresiones de esa declaración, luego deserializarlo en un proceso diferente y obtener la respuesta correcta. Eso significa que no hay cierres externos; la lambda debe funcionar solo con lo que crea o se le da como parámetro.

Linq2NH 1.0, IIRC, también se bloquea cuando se usan miembros de la clase no asignados, por lo que si, por ejemplo, tiene una propiedad calculada de solo lectura como un promedio especial ponderado o variable, debe asignarla a un Columna DB para hacer referencia a ella en lambda (o recrear la lógica en lambda). Esto se debe a que el árbol de expresiones eventualmente se reducirá a SQL (a través de uno de los intermedios de NH, en 2.x es ICriteria, en 3.x es HQL) y si NH no puede tomar una expresión y convertirla 1: 1 en un SQL expresión que se evaluará con éxito, simplemente no va a funcionar.

Hay un caso especial: Linq2NH, IIRC, es lo suficientemente inteligente como para convertir una expresión IList.Contains() en una cláusula IN. La lista debe definirse dentro de la lambda (como new[]{"1","2"}.Contains(m.ID)).

+0

Muy buena respuesta, solo una corrección - la forma en que lo expresaste en 3.x que pasa a través de HQL, parece que estás diciendo que la consulta LINQ se convierte primero en una cadena HQL. Lo que sucede es que el árbol de expresiones se vuelve a analizar en los mismos AST que el analizador HQL ANTLR se dirige. Esto es mucho más eficiente que apuntar a una cadena;) http://blogs.imeta.co.uk/sstrong/archive/2009/02/22/617.aspx –

3

La publicación del blog de Ayende es de mayo de este año. Muchas cosas cambiaron El NHiberante. El proveedor Linq 1.0 linq está en desuso desde hace aproximadamente un año debido al nuevo proveedor de linq en el NHibernate Trunk. El nuevo proveedor de linq aún no está completamente terminado, pero ya es muy completo y utilizable por mucho más que el antiguo proveedor de linq. Las cosas que no funcionan con el nuevo proveedor de linq se consideran errores y se resolverán algún día cuando se informen.

Puede usar saltar y tomar con el proveedor linq antiguo y nuevo. La lista actual de problemas conocidos se puede encontrar en NHibernate Jira. Se desconocen otros problemas y todas las demás características ya son compatibles.