Pregunta

Estoy intentando realizar lo que solo puedo describir como la versión inversa de IN () utilizando los Criterios de Nhibernate ...

En lugar de decir que el valor almacenado en la propiedad está en la lista / colección X

Quiero decir, este valor X (una ID) está en la lista que es una propiedad del objeto.

Cualquier ayuda apreciada, puedo intentar explicarlo mejor si esto no tiene sentido.

EDIT Le pido disculpas a la gente, como entiendo que esto no tiene suficiente sentido ...

Tengo un elemento de evento en mi sistema que puede tener una lista de público (elementos) a la que se aplica. Si el administrador desea eliminar un elemento de audiencia, quiero comprobar que ningún elemento haga referencia al elemento. (La AudienceList se almacena como una lista de cadenas de ID para audiencias).

Lo que estaba pensando era algo como:

var results = SessionInstance.Session.CreateCriteria (typeof (EventItem.Items.EventItem)) .Add (Restrictions.In (" AudienceList " ;, myAudience.ID)) .List ();

Pero necesito que AudienceList y myAudience.ID sean al revés, ¿no es así? Tengo el ID de audiencia, pero necesito verificar que pueda estar en una lista de otros ID.

Gracias de nuevo.

EDIT 2

La definición de EventItem es tal que una de sus propiedades es un DetailCollection of Audience IDs, que se guardan en la base de datos como una lista de ID de cadenas.

¿Fue útil?

Solución

EDITAR: Rechazó mi respuesta anterior.

Bueno, parece que aquí no hay un verdadero modelo relacional, por lo que las cosas no serán tan bonitas. Sin claves externas y similares, no estoy seguro de que NHibernate sea muy útil en esta situación (al menos para generar una consulta agradable).

Si todas las ID de audiencia para un solo registro de evento se almacenan en un solo campo, tendrá que usar un SQL LIKE o hacerlo en código. Obtenga todos los artículos de evento e itérelos a través de ellos, revisando sus colecciones de AudienceList para la ID que está buscando. Si recorres esa ruta, podría ser mejor crear un DTO para minimizar la cantidad de datos que mueves. Algo como

session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();

Suponiendo que solo debe informar al usuario que " este tipo de audiencia todavía está en uso " Y no señalar ejemplos específicos. De lo contrario tendrás que agregar más datos.

Otros consejos

¿Quieres decir algo como esto?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top