使nhibernate在多对多关系上进行连接

时间:2011-05-04 19:38:50

标签: c# nhibernate criteria criteria-api queryover

我有以下情况我被卡住了。 我有一个名为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以获得正确的结果?

提前谢谢

P.S。

这是我的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 :(得分:0)

你错过了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);