次のような 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; }
}
特定のユーザーが UserId で各ツイートに投票したかどうかを示す追加の列を含むツイートのリストを選択する NHibernate でクエリを実行しようとしています。ユーザーがツイートに投票すると、上記の「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; }
・・・こんなことになるの?