2011-08-11 12 views
8

Tener un repositorio para NHibernate con las consultas LINQ como estaNHibernate eficiente Eliminar el uso de LINQ Dónde condición

var q = from x in SomeIQueryable<SomeEntity> where x.A1 == a1 && x.B1 == b1 select x; 

¿Existe una solución de cómo obtener este filtro WHERE y aplicarlo para "one-shot-delete", que parece ser sólo posible a través de HQL:

var cmd = string.Format("delete from SomeEntity where x.A1 = '{0}' and x.B1 = {1}", a1, b1); 
session.CreateQuery(cmd).ExecuteUpdate(); 

Respuesta

6

proveedor de LINQ NH y la API de criterios/queryover no admiten condicionales eliminaciones/actualizaciones. HQL o SQL sin formato son las únicas opciones a menos que esté buscando extender NHibernate.

0
(from x in NHSession.Query<SomeEntity>() 
        where x.A1 == a1 && x.B1 == b1 
        select x).ForEach(y => { NHSession.Delete(y) }); 
     NHSession.Flush(); 
+1

fija por favor una explicación; las respuestas de solo código no dicen mucho. – rgettman

+0

El problema con esto es que carga todas las entidades en el camino solo para eliminarlas. –

+0

Esto no es lo que llamamos eficiente – Beatles1692

1

Actualmente, a partir de NH 4.0.1, no es posible. Sin embargo, hay un problema abierto en Jira (NH-3659, https://nhibernate.jira.com/browse/NH-3659). Existe una solución maliciosa basada en un interceptor personalizado y un reemplazo de SQL descrito en http://weblogs.asp.net/ricardoperes/strongly-typed-delete-with-nhibernate, pero estoy trabajando en una solución limpia y eventualmente enviaré una solicitud de extracción.

+0

Olvidé decir que estoy trabajando en NH-3659, pero hasta ahora no tengo nada que mostrar. Hay un par de alternativas mencionadas en esta publicación: https://weblogs.asp.net/ricardoperes/deleting-entities-in-nhibernate (descargo de responsabilidad: la mía) –

+0

He enviado una solicitud de extracción para NH-3659 - Strongly Typed Borrar. El enlace está disponible en https://nhibernate.jira.com/browse/NH-3659. –

0

Ahora es posible con Nhibernate 5.0:

session.Query<SomeIQueryable>() 
      .Where(x => x.A1 == a1 && x.B1 == b1) 
      .Delete(); 

Documentación:

// 
    // Summary: 
    //  Delete all entities selected by the specified query. The delete operation is 
    //  performed in the database without reading the entities out of it. 
    // 
    // Parameters: 
    // source: 
    //  The query matching the entities to delete. 
    // 
    // Type parameters: 
    // TSource: 
    //  The type of the elements of source. 
    // 
    // Returns: 
    //  The number of deleted entities. 
    public static int Delete<TSource>(this IQueryable<TSource> source);