繁体   English   中英

在NHibernate QueryOver的条件下使用SelectSubQuery的结果

[英]Use the result of SelectSubQuery in a condition with NHibernate QueryOver

我正在将NHibernate与IQueryOver一起使用来检索List<Message> 用户可以将Message标记为收藏。 每个Message都有一个属性public bool IsFavourite ,当至少一个User已将该Message标记为他们的收藏夹时,此属性为true 因此,在我的查询中,我使用SelectSubQuery来检索它被标记为收藏夹的次数。 到现在为止还挺好。 我还想在设置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只是在那里,因此我可以设置IsFavourite属性。 所以我想做的是在条件中使用SubQuery结果并将该条件的结果设置为IsFavourite例如.SelectSubQuery(subquery.ToRowCountQuery()) > 0).WithAlias(() => messageDto.IsFavourite)

如果您的MessageDTO实体中已经有FavouriteCount ,则可以使用如下所示的readonly C#属性:

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)
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM