2017-11-27 7 views
0

나는 Hibernate와 IQueryOver를 사용하여 List<Message>을 검색하고 있습니다. 사용자는 Message을 즐겨 찾기로 표시 할 수 있습니다. 각 Message의 속성은 public bool IsFavourite이며 User 중 하나 이상을 Message으로 지정하면 true이 포함됩니다. 그래서 내 쿼리에서 즐겨 찾기로 표시된 횟수를 검색하려면 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