2011-01-12 23 views
7

Quiero eliminar varios registros de una entidad determinada donde el ID de la entidad se encuentra en la lista de identificadores que tengo. Estoy intentando realizar esta acción en C# con NHibernate.Eliminar múltiples registros por lista de identificadores con declaración HQL

Lo que tengo es una lista de Ids.

quiero hacer algo similar a esto:

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

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

Esto se traduce en el siguiente error:

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

La consulta es una sentencia HQL.

¿Qué hay de malo en la consulta HQL.

Las dos respuestas proporcionadas a la pregunta anterior dan una solución correcta. Sin embargo, cuando ejecuto el HQL, el error es el siguiente:

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

La entidad MapsItem deriva de la entidad BaseEntity. Ambos tienen un Id de propiedad en la base de datos. La consulta SQL no se puede ejecutar porque el Id de la columna en la cláusula WHERE es ambiguo.

¿Cómo puedo resolver este problema?

+0

que he encontrado el mismo problema (nombre de la columna ambigua 'id') mientras trata de elementos derivados de actualización masiva utilizando Query.executeUpdate – Silviu

+1

Es necesario volver a caer a SQL! – Rippo

Respuesta

5

Retire el signo igual:

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

no funciona incluso si() se agregará alrededor de: idList – Gutek

1

Eliminar los iguales a firmar y también su inquery es incorrecta. Debería ser algo como esto. y le sugiero que use string.Format en su lugar.

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

He editado la pregunta para indicar qué errores se producen – Jan

Cuestiones relacionadas