Pregunta

¿Cuál es la mejor práctica para este problema? ¿Hay alguna característica de lotes incorporada?

Código de muestra:

using (ITransaction transaction = _session.BeginTransaction())
{
   _session.Delete("FROM myObject o WHERE  o.Id = IN(1,2,...99999)");
   transaction.Commit();
}

Gracias por adelantado.

¿Fue útil?

Solución

HQL admite la cláusula In y si usa SetParameterList incluso puede pasar en una colección.

var idList = new List<int>() { 5,3,6,7 };

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();

Tenga en cuenta, como mencionado por Ddango en un comentario, que las cascadas de relaciones especificadas en sus objetos no se ejecutarán ya que ejecutar una consulta HQL simplemente se traduce en una consulta de DB y en realidad no carga ningún objeto de entidad.

Otros consejos

Tuve problemas para obtener la respuesta al trabajo y encontré que la siguiente consulta funcionaba al 100%

        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();

El cliente es el nombre de clase, no el nombre de la tabla. ID es minúscula y en HQL es la clave principal, no un nombre de propiedad en la clase (los nombres de propiedad son compatibles)

Puede usar HQL para eliminar varios objetos

Busque Eliminar aquí - para session.delete Ejemplo

Ejemplo de eliminación de HQL (puede usar con HQL):

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = session.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top