Заставить nhibernate присоединиться к отношениям «многие ко многим» - PullRequest
1 голос
/ 04 мая 2011

У меня следующая ситуация, я застрял. У меня есть объект с именем ContactAssociation, который имеет (среди прочего) свойства Client и Contact. Я должен получить все контакты для клиента, которые выполняют некоторые условия. Условия: У каждого Клиента есть свойство BusinessEntities, которое является коллекцией BusinessEntity, у каждого BusinessEntity есть BusinessLevel. Это код, который, я уверен, сделает это более понятным:

link.Session.QueryOver<ContactAssociation>(() => ca)
                                       //.Fetch(asoc => asoc.Client)
                                       .JoinAlias(() => ca.Client, ()=> client)

.Left.JoinQueryOver<BuEntry>(() => client.BuEntries, () => be)
                                       .Where(() => client.ID == clientKey)
                                       .Where(() =>    be.BuLevel.LevelNo > buLevel);

Хорошо, я написал что-то вроде этого и продолжаю получать сообщение об ошибке, что свойство BuLevel.LevelNo не может быть найдено Но это есть в модели

Я попробовал критерии, но увидел ту же ошибку, только в NHProfiler вместо Visual Studio, и в Visual Studio была более загадочная ошибка. Тем не мение ... В конце концов я решил проблему с SQL-запросом, но как мне написать QueryOver и / или Criteria для получения правильных результатов?

Заранее спасибо

приписка

Вот мой SQL-запрос:

 careTeamMembers = link.Session.CreateSQLQuery(@"select c.* from ContactAssociation ca
                                inner join Contact c
                                on ca.contactkey = c.contactkey
                                left join ContactBu cb
                                on cb.contactkey = c.contactkey
                                left join BuEntry be
                                on cb.entrykey = be.entrykey
                                left join BuLevel bl
                                on be.levelkey = bl.levelkey
                                where ca.clientkey = :clientkey
                                and bl.levelno > :level")
            .AddEntity(typeof(Contact))
            .SetInt32("clientkey", clientKey)
            .SetInt32("level", buLevel)
            .SetMaxResults(1000)
            .List<Contact>();

1 Ответ

0 голосов
/ 05 мая 2011

Вам не хватает соединения на BULevel

link.Session.QueryOver<ContactAssociation>(() => ca)
                                       //.Fetch(asoc => asoc.Client)
                                       .JoinAlias(() => ca.Client, ()=> client)

.Left.JoinQueryOver<BuEntry>(() => client.BuEntries, () => be)
                                       .Where(() => client.ID == clientKey)
                                       .JoinQueryOver<BuLevel>(() => be.BuLevel)
                                       .Where(bu => bu.LevelNo > buLevel);
...