У меня есть объект, который представляет твит из Twitter, как так:NHibernate - Запрос из коллекции типов значений (не Entity) для решения Выберите 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; }
}
Я пытаюсь запустить запрос в 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' ошибки. Пожалуйста помоги!
Update: Я начинаю думать, что это не представляется возможным запрашивать коллекции типов значений на всех, и что я должен использовать полномасштабный объект следующим образом:
public virtual ISet<Vote> Votes { get; protected set; }
... будет ли это так?