2011-01-12 5 views
7

Ich möchte mehrere Datensätze einer bestimmten Entität löschen, wobei die ID der Entität in der Liste der IDs, die ich habe, ist. Ich versuche diese Aktion in C# mit NHibernate auszuführen.Löschen mehrerer Datensätze nach Liste von IDs mit HQL-Anweisung

Was ich habe, ist eine Liste von Ids.

Ich möchte etwas ähnliches wie dies tun:

var idList = new List<Guid>() { Guid.NewGuid(),Guid.NewGuid()}; 

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

Dies führt zu dem folgenden Fehler:

Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 33 [DELETE FROM Album o WHERE o.Id = IN :idList] 

Die Abfrage ist eine HQL-Anweisung.

Was ist falsch in der HQL-Abfrage.

Die beiden angegebenen Antworten auf die obige Frage geben eine korrekte Lösung. Wenn ich die HQL ausführe, ist der Fehler jedoch wie folgt:

could not insert/select ids for bulk delete[SQL: insert into #MapsItem SELECT mapsitem0_.Id as Id FROM MapsItem mapsitem0_ inner join BaseEntity mapsitem0_1_ on mapsitem0_.Id=mapsitem0_1_.Id WHERE Id in (? , ? , ? , ? , ? , ?)] 

Die Entität MapsItem stammt von der Entität BaseEntity. Beide haben eine Eigenschaften-ID in der Datenbank. Die SQL-Abfrage kann nicht ausgeführt werden, da die Spalten-ID in der WHERE-Klausel zweideutig ist.

Wie kann ich dieses Problem lösen?

+0

Ich habe das gleiche Problem (mehrdeutiger Spaltennamen ‚id‘) festgestellt, während Bulk-Update abgeleitete Elemente versuchen, mit query.ExecuteUpdate – Silviu

+1

Sie müssen SQL fallen zurück! – Rippo

Antwort

5

das Gleichheitszeichen entfernen:

DELETE FROM myObject o WHERE o.Id IN :idList 
+0

es funktioniert nicht, auch wenn() wird hinzugefügt werden: idList – Gutek

1

das Gleichheits löschen zu unterzeichnen und auch Ihre inquery falsch. Es sollte so etwas sein. und ich würde vorschlagen, dass Sie stattdessen string.Format verwenden.

var idList = new List<Guid>() { Guid.NewGuid(),Guid.NewGuid()}; 

_session.CreateQuery(string.Format("DELETE FROM myObject o WHERE o.Id IN  
({0})",string.Join(",",idList.ToArray()))).ExecuteUpdate(); 
+0

Ich überarbeitete die Frage, um anzuzeigen, welche Fehler auftritt – Jan