C# 你能过滤nhibernate子集合吗?
我有下面的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 =&
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是可选的