j'ai une entité qui représente un Tweet de Twitter comme ceci:NHibernate - Interrogation à partir d'une collection de types de valeur (non-entité) pour résoudre Sélectionnez N + 1
public class Tweet
{
public virtual long Id { get; set; }
public virtual string Username { get; set; }
public virtual string Message { get; set; }
// other properties (snip)...
public virtual ISet<long> VoterIds { get; protected set; }
}
Je suis en train d'exécuter un requête dans NHibernate qui sélectionne une liste de tweets avec une colonne supplémentaire qui indique si un utilisateur particulier par son UserId a voté pour chaque Tweet. Lorsque je vote pour un Tweet, il est stocké dans la collection 'VoterIds' ci-dessus. J'utilise une collection de types de valeur pour cela, puisque je ne m'intéresse vraiment à l'UserId Twitter pour déterminer si un utilisateur a déjà voté pour un tweet particulier. Par conséquent pourquoi il est un ISet<long>
au lieu de ISet<Vote>
Je suis en train d'utiliser les projections comme ceci:
long userId = 123;
IList<TweetReport> tweets = Session.CreateCriteria<Tweet>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Id(), "Id")
.Add(Projections.Property("Username"), "Username")
.Add(Projections.Property("Message"), "Message")
.Add(Projections.Conditional(//---- WHAT GOES HERE!!??
.SetResultTransformer(Transformers.AliasToBean<TweetReport>())
.List<TweetReport>();
Je pensais que la bonne méthode était d'utiliser Projections.Conditional, mais je ne suis pas sûr de savoir comment utiliser il. Quelqu'un peut-il m'aider à remplir le bit //---- WHAT GOES HERE!!??
dans le code ci-dessus.
J'ai essayé d'utiliser Expressions.In:
.Add(Projections.Conditional(Expressions.In("VoterIds", new object[] { userId }),
Projections.Constant(true), Projections.Constant(false)))
... mais il m'a donné une 'Ne peut pas utiliser les collections avec InExpression' erreur. S'il vous plaît aider!
Mise à jour: Je commence à penser qu'il est impossible d'interroger des collections de types de valeur du tout, et que je devrais utiliser une entité à part entière comme ceci:
public virtual ISet<Vote> Votes { get; protected set; }
... serait-ce le cas?