我有一个代表 Twitter 推文的实体,如下所示:
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; }
}
我正在尝试在 NHibernate 中运行一个查询,该查询选择一个带有附加列的推文列表,该列表示特定用户的 UserId 是否为每条推文投票。当我用户为一条推文投票时,它存储在上面的“VoterIds”集合中。
我为此使用了一组值类型,因为我只对 Twitter UserId 真正感兴趣,以确定用户是否已经为特定推文投票。因此为什么它是一个ISet<long>
而不是ISet<Vote>
我正在尝试使用这样的预测:
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>();
我认为正确的方法是使用 Projections.Conditional,但我不确定如何使用它。有人可以帮我填写//---- WHAT GOES HERE!!??
上面代码中的内容吗?
我尝试使用 Expressions.In:
.Add(Projections.Conditional(Expressions.In("VoterIds", new object[] { userId }),
Projections.Constant(true), Projections.Constant(false)))
...但它给了我一个“不能使用 InExpression 的集合”错误。请帮忙!
更新:我开始认为根本不可能查询值类型的集合,我应该使用像这样的成熟实体:
public virtual ISet<Vote> Votes { get; protected set; }
……会是这样吗?