[英]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.