C# 你能过滤nhibernate子集合吗?

C# 你能过滤nhibernate子集合吗?,c#,nhibernate,C#,Nhibernate,我有下面的nHibernate查询,可以很好地提取实体并获取其子集合 var contactInfo = session.QueryOver<PeopleInfo>() .Fetch(x => x.Addresses).Eager .Fetch(x => x.EmailAddresses).Eager .Fetch(x =&

我有下面的nHibernate查询,可以很好地提取实体并获取其子集合

var contactInfo = session.QueryOver<PeopleInfo>()
                         .Fetch(x => x.Addresses).Eager
                         .Fetch(x => x.EmailAddresses).Eager
                         .Fetch(x => x.PhoneNumbers).Eager
                         .Where(x => x.Id == contactInfoId)
                         .SingleOrDefault();
现在,让我们假设在地址中有一个名为Active的字段, 有没有一种方法可以在一次呼叫中返回所有活动地址

我可以在事后过滤掉,我只是想知道是否有 一种通过查询完成的方法


谢谢

是的,您可以这样做,但是您需要在QueryOver查询中包含一些联接

在后台,.Fetch正在生成一组左连接,以返回完整的PeopleInfo列表,而不排除那些没有您急切获取的任何关联集合的人

您可以通过自己执行左联接来覆盖执行联接的方式

例如,如果要获取所有PeopleInfo,并且只获取活动地址,可以执行以下操作:

Address addressAlias;

var addressRestriction = Restrictions.Where(() => address.Active);

session.QueryOver<PeopleInfo>()
    .Left.JoinQueryOver(
        pi => pi.Addresses, () => addressAlias, addressRestriction)
    .Fetch(x => x.Addresses).Eager
    .Fetch(x => x.EmailAddresses).Eager
    .Fetch(x => x.PhoneNumbers).Eager
    .Where(x => x.Id == contactInfoId)
    .SingleOrDefault();
地址列包含在SELECT子句中,因为您已经加入了Address,并且正在选择整个PeopleInfo类

它们都生成相同的SQL,但您应该在探查器中进行验证。它应该是这样的:

选择此选项。*-所有PeopleInfo列 addressali1.*-所有地址列 emailaddre4.*-所有电子邮件地址列 从PeopleInfo这个 左外部联接地址地址ali1\u 在这个地址上,id=addressali1.personid 和地址ali1\uu1.active=1 左外部加入emailaddress emailaddre4_ 在这个u.id=emailaddre4 u.personid上 其中,此u0.id=
是的,您可以这样做,但是您需要在QueryOver查询中包含一些联接

在后台,.Fetch正在生成一组左连接,以返回完整的PeopleInfo列表,而不排除那些没有您急切获取的任何关联集合的人

您可以通过自己执行左联接来覆盖执行联接的方式

例如,如果要获取所有PeopleInfo,并且只获取活动地址,可以执行以下操作:

Address addressAlias;

var addressRestriction = Restrictions.Where(() => address.Active);

session.QueryOver<PeopleInfo>()
    .Left.JoinQueryOver(
        pi => pi.Addresses, () => addressAlias, addressRestriction)
    .Fetch(x => x.Addresses).Eager
    .Fetch(x => x.EmailAddresses).Eager
    .Fetch(x => x.PhoneNumbers).Eager
    .Where(x => x.Id == contactInfoId)
    .SingleOrDefault();
地址列包含在SELECT子句中,因为您已经加入了Address,并且正在选择整个PeopleInfo类

它们都生成相同的SQL,但您应该在探查器中进行验证。它应该是这样的:

选择此选项。*-所有PeopleInfo列 addressali1.*-所有地址列 emailaddre4.*-所有电子邮件地址列 从PeopleInfo这个 左外部联接地址地址ali1\u 在这个地址上,id=addressali1.personid 和地址ali1\uu1.active=1 左外部加入emailaddress emailaddre4_ 在这个u.id=emailaddre4 u.personid上 其中,此u0.id=
感谢您提供有关获取左加入的信息。。。我最终使用了JoinAlias而不是JoinQueryOver,这样我就可以对多个子集合进行过滤。还有一个问题-如果要返回空集,我应该使用左外连接而不是左连接吗?@aggietech:left-outer和left-join是相同的outer是可选的。感谢提供有关获取左连接的信息。。。我最终使用了JoinAlias而不是JoinQueryOver,这样我就可以对多个子集合进行过滤。还有一个问题-如果要返回空集,我应该执行左外连接而不是左连接吗?@aggitech:left-outer和left-join是相同的,outer是可选的