2016-03-29 35 views
2

Arada pek çok benzer konu olduğunu biliyorum ama aradığım yanıtı bulamadım.NHibernate JoinQueryOver tüm alt yazı girişlerini döndürür

Receivers listesine sahip Message var. new numaralı tüm iletilere ve A türünde alıcılara sahip olmaya çalışıyorum. Tüm mesajların karşılık gelen alıcılara sahip olduğunu, ancak tüm alıcıları ile aldım. Ben sadece ilgileniyorum alıcıları almak istiyorum Burada

ben kullanmaya çalışıyorum budur.

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

konuda yardıma olması harika olurdu. Ayrıca, ileti alıp alıcının sorgusu almak için Select kullanmayı denedim, ancak bu da işe yaramadı. takma adla

cevap

0

deneyin QueryOver:

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

benTransformers.AliasToEntityMap burada yararlı olabileceğini düşünüyorum . Temel olarak, ortaya çıkan sorgunuzdaki her satırı, diğer adlara ve varlıklara karşılık gelen değerlere karşılık gelen tuşlara sahip bir IDictionary değerine dönüştürür. Örneğin:

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"];