Question

J'essaie de réaliser ce que je ne peux que décrire comme la version inversée de IN () à l'aide des critères de Nhibernate.

Plutôt que de dire que la valeur stockée dans la propriété est dans la liste / collection X

Je veux dire, cette valeur X (un ID) est dans la liste qui est une propriété de l'objet.

Toute aide appréciée, je peux essayer de mieux expliquer si cela n’a aucun sens.

EDIT Toutes mes excuses, je comprends que cela n’a pas assez de sens ...

J'ai un élément d'événement dans mon système qui peut avoir une liste d'audience (éléments) auquel il s'applique. Si l'administrateur souhaite supprimer un élément de l'audience, je souhaite vérifier que l'élément n'est référencé par aucun événement. (AudienceList est stocké sous la forme d'une liste de chaînes d'identifiants pour les audiences).

Ce que je pensais était quelque chose du genre:

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

Mais j'ai besoin que AudienceList et myAudience.ID soient l'inverse, n'est-ce pas? J'ai l'identifiant d'audience, mais je dois vérifier qu'il se trouve peut-être dans une liste d'autres identifiants.

Merci encore.

EDIT 2

La définition de l'objet de l'événement est telle que l'une de ses propriétés est un ID de détail de la collection d'audiences, elles sont enregistrées dans la base de données sous la forme d'une liste d'ID de chaîne.

Était-ce utile?

La solution

EDIT: J'ai abandonné ma réponse précédente.

Eh bien, on dirait qu’il n’ya pas de véritable modèle relationnel ici, donc les choses ne seront pas aussi jolies. Sans clés étrangères, etc., je ne suis pas sûr que NHibernate sera très utile dans cette situation (au moins pour générer une requête intéressante).

Si tous les ID d’audience d’un même enregistrement d’événement sont stockés dans un seul champ, vous devrez soit utiliser un SQL LIKE, soit le faire en code. Récupérez tous les éléments d'événement et parcourez-les, en vérifiant leurs collections AudienceList pour l'identifiant que vous recherchez. Si vous choisissez cette voie, il peut être préférable de créer un DTO afin de minimiser la quantité de données que vous déplacez. Quelque chose comme

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

Cela suppose que vous ayez juste besoin d'informer l'utilisateur que "ce type d'audience est toujours utilisé". et ne pas signaler des cas spécifiques. Sinon, vous devrez ajouter plus de données.

Autres conseils

Voulez-vous dire quelque chose comme ça?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top