C# 让nhibernate加入多对多关系

C# 让nhibernate加入多对多关系,c#,nhibernate,criteria,criteria-api,queryover,C#,Nhibernate,Criteria,Criteria Api,Queryover,我有以下情况我被卡住了。 我有一个名为ContactAssociation的实体,其中包括属性客户端和联系人。 我必须得到满足某些条件的客户的所有联系人。 条件是: 每个客户端都有属性BusinessEntity,它是BusinessEntity的集合,每个BusinessEntity都有一个BusinessLevel。 这是代码,我相信这会让您更容易理解: link.Session.QueryOver<ContactAssociation>(() => ca)

我有以下情况我被卡住了。 我有一个名为ContactAssociation的实体,其中包括属性客户端和联系人。 我必须得到满足某些条件的客户的所有联系人。 条件是: 每个客户端都有属性BusinessEntity,它是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 但它在模型中

我尝试了criteria,但我看到了相同的错误,只是在NHProfiler中,而不是在Visual Studio中,并且在Visual Studio中有一个更神秘的错误。 无论如何 我最终用sql查询解决了这个问题,但是我应该如何编写查询版本和/或条件以获得正确的结果呢

先谢谢你

附言

以下是我的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>();

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

您的SQL查询是什么样子的?这可能有助于我们了解期望的最终结果。BusinessLevel也是一个实体吗?@Vadim yes business level是一个实体entity@cs我已添加SQL查询。我收到以下错误:System.ArgumentException:值SL.STAdmin.DAL.ContactAssociation不是SL.STAdmin.DAL.Contact类型,因此无法在此泛型集合中使用。这是我写的代码:ContactAssociation ca=null;联系客户=null;BUBE=null;careTeamMembers=link.Session.QueryOver=>ca.JoinAlias=>ca.Client,=>Client.Left.JoinQueryOver=>Client.BuEntries,=>be.Where=>clientKey.JoinQueryOver=>be.BuLevel.Wherebu=>bu.LevelNo>BuLevel.Take1000.List@Para,您的查询是针对ContactAssociations的,但您希望它返回Contacts。它不可能做到这一点。您可以添加用于检索关联联系人的投影,从联系人端创建条件,或返回联系人关联列表。@Para,您可以在此处了解有关投影的更多信息以及其他方法,这些都取决于您的实体结构。