2011-01-12 11 views
7

Voglio eliminare più record di una determinata entità in cui l'ID dell'entità è presente nell'elenco di ID che ho. Sto cercando di eseguire questa azione in C# con NHibernate.Elimina più record per elenco di ID con istruzione HQL

Quello che ho è un elenco di Id.

voglio fare qualcosa di simile a questo:

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

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

Ciò si traduce nella seguente errore:

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

La query è una dichiarazione HQL.

Cosa c'è di sbagliato nella query HQL.

Entrambe le risposte fornite alla domanda precedente danno una soluzione corretta. Tuttavia, quando eseguo l'HQL, l'errore è il seguente:

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 (? , ? , ? , ? , ? , ?)] 

L'entità MapsItem deriva dall'entità BaseEntity. Entrambi hanno un ID di proprietà nel database. La query SQL non può essere eseguita, perché l'ID della colonna nella clausola WHERE è ambiguo.

Come posso risolvere questo problema?

+0

che ho incontrato lo stesso problema (nome di colonna ambigui 'id') durante il tentativo di aggiornamento di massa utilizzando elementi derivati ​​query.ExecuteUpdate – Silviu

+1

È necessario ripiegare a SQL! – Rippo

risposta

5

Rimuovere il segno di uguale:

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

non funziona anche se() sarà aggiunto in giro: idList – Gutek

1

Eliminare l'uguale a firmare e anche la vostra inquery non è corretto. Dovrebbe essere qualcosa di simile. e ti suggerirei di usare string.Format invece.

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

Ho editato la domanda per indicare quali errori si verificano – Jan