2011-12-14 2 views
1

Я имею эту таблицу структуру:Как мы можем принести больше одного коллекции Grandchild

 ReferralSource - main table 
     -Phone - join table Rs as one-to-one 
     - Carrier - child table for Phone 
     - Type - child table for Phone 

Я хочу, чтобы получить его Linq запрос:

Session.Query<ReferralSource>()     
      .Fetch(x => x.Phone) 
      .ThenFetch(x => x.Type) 
      .Fetch(x => x.Phone) 
      .ThenFetch(x => x.Carrier); 

И этот запрос получить этот SQL-код:

select referralso0_.Id,       
       referralso0_.FirstName,     
       phonetype4_.TypeName 
       carrier6_.Name     
     from REFERRALSOURCES referralso0_     
       left outer join PHONES phone3_ 
       on referralso0_.PhoneId = phone3_.Id 
       left outer join PHONETYPES phonetype4_ 
       on phone3_.TypeId = phonetype4_.Id 
      - duplicated join started 
      left outer join PHONES phone5_ 
      on referralso0_.PhoneId = phone5_.Id 
      left outer join CARRIERS carrier6_ 
      on phone5_.CarrierId = carrier6_.Id - duplicated join finished 

Как удалить дублированное левое соединение с помощью fetch?

ответ

1

Может быть, если вы карту телефона в качестве компонента вместо объекта

public ReferralSourceMap() 
{ 
    Join("Phones", join => 
    { 
     join.KeyColumn("..."); 
     join.Component(x => x.Phone, c => { ... }); 
    }); 
} 

Edit: несчастливо это не будет работать с LINQ2NHibernate только с критериями и QueryOver. Должен ли я удалить ответ?

+0

Я думаю, что это может быть полезно для других людей. –