2017-11-27 3 views
0

Ich verwende NHibernate mit IQueryOver, um eine List<Message> abzurufen. Benutzer können eine Message als Favorit markieren. Jede Message hat eine Eigenschaft public bool IsFavourite, die true enthält, wenn mindestens eine User diese Message als ihren Favoriten markiert hat. Also in meiner Abfrage verwende ich SelectSubQuery, um die Anzahl zu erhalten, wie oft es als Favorit markiert wurde. So weit, ist es gut. Ich möchte auch das Ergebnis von dieser Unterabfrage in einer Bedingung verwenden, um IsFavourite festzulegen.Verwenden Sie das Ergebnis von SelectSubQuery in einer Bedingung mit NHibernate QueryOver

Meine Abfrage sieht jetzt so aus.

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

Die Eigenschaft MessageDto,FavouriteCount ist nur da, damit ich die IsFavourite Eigenschaft einstellen. Also, was würde ich tun möchte, ist das SubQuery Ergebnis in einem Zustand verwenden, und das Ergebnis dieser Bedingung IsFavourite wie .SelectSubQuery(subquery.ToRowCountQuery()) > 0).WithAlias(() => messageDto.IsFavourite)

Antwort

1

gesetzt Wenn Sie bereits FavouriteCount haben in Ihrer MessageDTO Einheit dann können Sie nur Nur-Lese-C# ähnliche Immobilien nutzen :

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

Hallo Roman, mein Ziel war es, die 'FavouriteCount' Eigenschaft zu entfernen:

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

Ansonsten können Sie benutzerdefinierte Projektion verwenden. Ich löste das mit Ihrem 'Projections' Beispiel. Vielen Dank! – Bunnynut

Verwandte Themen