2017-11-27 2 views
0

NHibernateをIQueryOverで使用してList<Message>を取得しています。ユーザーはMessageをお気に入りに設定できます。各Messageは、少なくともUserの1つがMessageをお気に入りとしてマークした場合、trueを含むプロパティpublic bool IsFavouriteを持っています。 私の質問では、SelectSubQueryを使用して、お気に入りとしてマークされた回数を取得します。ここまでは順調ですね。また、サブクエリの結果をIsFavouriteに設定する条件で使用したいとします。SelectSubQueryの結果をNHibernate QueryOverの条件で使用する

私の質問は今のようになります。私はIsFavouriteプロパティを設定することができるように

Message messageAlias = null; 
MessageDTO messageDto = null; 

var messages = GetSessionFactory().GetCurrentSession() 
    .QueryOver<Message>(() => messageAlias) 
    .SelectList(list => list 
     .Select(() => messageList.Id).WithAlias(() => messageDto.Id) 
     .Select(() => messageList.Title).WithAlias(() => messageDto.Title) 
     .SelectSubQuery(
      QueryOver.Of<UserMessageFavourite>() 
      .Where(f => f.Message.Id == messageAlias.Id).ToRowCountQuery()).WithAlias(() => messageDto.FavouriteCount) 
     ) 
    ) 

プロパティMessageDto,FavouriteCountは単にそこにあります。だから私がやりたいものを既にお使いのMessageDTOエンティティにFavouriteCountを持っているなら、あなたはこのような読み取り専用C#のプロパティを使用することができる条件でサブクエリの結果を使用して.SelectSubQuery(subquery.ToRowCountQuery()) > 0).WithAlias(() => messageDto.IsFavourite)

答えて

1

ようIsFavouriteにその条件の結果を設定することです:

class MessageDTO { 
    //other properties 
    public int FavouriteCount { get; set; } 
    public bool IsFavorite => FavouriteCount > 0; 
} 

そうでない場合は、カスタム投影使用することができます。

Message messageAlias = null; 
MessageDTO messageDto = null; 

var projection = Projections.Conditional(
    Subqueries.Exists(QueryOver.Of<UserMessageFavourite>() 
         .Where(f => f.Message.Id == messageAlias.Id).DetachedCriteria)), 
    Projections.Constant(true), 
    Projections.Constant(false)); 

var messages = GetSessionFactory().GetCurrentSession() 
    .QueryOver<Message>(() => messageAlias) 
    .SelectList(list => list 
     .Select(() => messageList.Id).WithAlias(() => messageDto.Id) 
     .Select(() => messageList.Title).WithAlias(() => messageDto.Title) 
     .Select(projection).WithAlias(() => messageDto.IsFavorite) 
    ) 
+0

こんにちはローマを、私の目標は、 'FavouriteCount'プロパティを削除することでした。 私はあなたの 'Projections'の例を使ってこれを解決しました。ありがとう! – Bunnynut

関連する問題