Frage

Was ist die beste Praxis für dieses Problem? Gibt es integrierte Chargenfunktionen?

Beispielcode:

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

Danke im Voraus.

War es hilfreich?

Lösung

HQL unterstützt die In -Klausel. Wenn Sie SetParameterList verwenden, können Sie sogar eine Sammlung übergeben.

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

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

Beachten Sie, wie von Ddango in einem Kommentar erwähnt wird, dass die in Ihren Objekten angegebenen Beziehungskaskaden nicht ausgeführt werden, da das Ausführen einer HQL -Abfrage lediglich eine DB -Abfrage übersetzt und keine Entitätsobjekte geladen wird.

Andere Tipps

Ich hatte Probleme, die Antwort auf die Arbeit zu bekommen, und ich fand, dass die folgende Frage zu 100% funktioniert hat

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

Kunde ist der Klassenname, nicht der Tabellenname. ID ist Kleinbuchstaben und in HQL ist es der Hauptschlüssel, kein Eigenschaftsname in der Klasse (Eigenschaftsnamen werden unterstützt)

Sie können HQL verwenden, um mehrere Objekte zu löschen

Suchen Sie hier löschen - für Sitzung.Delete Beispiel

HQL -Beispiel -Beispiel (Sie können mit HQL verwenden):

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top