2016-03-29 16 views
2

Ich weiß, dass es viele ähnliche Themen gibt, aber ich konnte die Antwort, nach der ich suche, nicht finden.NHibernate JoinQueryOver gibt alle Untertypeinträge zurück

Ich habe Message mit Liste von Receivers. Ich versuche, alle Nachrichten mit dem Status new und Empfänger des Typs A zu erhalten. Ich bekomme alle Nachrichten mit entsprechenden Empfängern, aber mit allen ihren Empfängern. Ich möchte nur den Empfänger bekommen Ich interessiere mich für

Hier ist, was ich zu verwenden versuche.

var messages = session.QueryOver<MessageDTO>() 
    .Where(message => message.State == MessageState.New) 
    .JoinQueryOver<MessageReceiverDTO>(message => message.MessageReceivers) 
    .Where(receiver => receiver.Type == ReceiverType.A) 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List(); 
    //.Where(message => message.MessageReceivers.Count > 0) 
    //.ToList(); 

groß sein würde helfen mit, dass zu haben. Ich versuchte auch, Select zu verwenden, um Nachricht und Empfänger aus der Abfrage zu bekommen, aber das hat auch nicht funktioniert.

Antwort

0

Try QueryOver mit Alias:

MessageDTO messageAlias = null; 
MessageReceiverDTO receiverAlias = null; 

var query = 
    session.QueryOver<MessageDTO>(() => messageAlias) 
     .JoinAlias(() => messageAlias.Receivers,() => receiverAlias) 
     .Where(() => messageAlias.State == MessageState.New) 
     .And(() => receiverAlias.Type == ReceiverType.A); 
0

Ich denkeTransformers.AliasToEntityMap nützlich sein könnten hier. Grundsätzlich transformiert es jede Zeile in der resultierenden Abfrage in eine IDictionary mit Schlüsseln, die Alias-Namen und Werten entsprechen, die Entitäten entsprechen. Zum Beispiel:

MessageDTO message = null; 
MessageReceiverDTO receiver = null; 

var messages = session.QueryOver<MessageDTO>(() => messageAlias) 
    .Where(message => message.State == MessageState.New) 
    .JoinQueryOver<MessageReceiverDTO>(message => message.MessageReceivers,() => receiver) 
    .Where(receiver => receiver.Type == ReceiverType.A) 
    .TransformUsing(Transformers.AliasToEntityMap) 
    .List<IDictionary>(); 

MessageDTO firstMessage = (MessageDTO)messages[0]["message"]; 
MessageReceiverDTO firstReceiver = (MessageReceiverDTO)messages[0]["receiver"];