Domanda

Qual è la migliore pratica per questo problema? C'è qualche funzionalità dosaggio built-in?

Codice di esempio:

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

Grazie in anticipo.

È stato utile?

Soluzione

HQL supporta la clausola IN, e se si utilizza setParameterList si può anche passare in una collezione.

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

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

Essere consapevoli, come citato da ddango in un commento, che cascate di relazione di cui gli oggetti non saranno eseguiti dal momento che esegue una query HQL si traduce semplicemente a una query DB e non realmente caricare eventuali oggetti entità.

Altri suggerimenti

ho avuto problemi nel trovare la risposta al lavoro e ho trovato la seguente query ha funzionato al 100%

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

Il cliente è il nome della classe non è il nome della tabella. id è minuscolo e in HQL è la chiave primaria non è un nome di proprietà della classe (I nomi delle proprietà sono supportati)

Potete utilizzare HQL per eliminare più oggetti

Cercare delete qui - per Session.delete esempio

HQL DELETE esempio (è possibile utilizzare in 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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top