엔터티를 가져오고 하위 컬렉션을 열망하는 데 잘 작동하는 다음 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
는 당신이 간절히 가져 오는 관련 컬렉션이없는 사람들을 제외하지 않고 LEFT JOIN
전체 목록을 다시 가져 오기 위해 많은 s를 생성합니다 PeopleInfo
.
왼쪽 조인을 직접 수행하여 조인 수행 방식을 재정의 할 수 있습니다.
예를 들어 모든 PeopleInfo
주소 를 가져 오려면 Active
다음을 수행 할 수 있습니다.
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();
지금, 당신에 있기 때문에 JOIN
에 보내고 Address
전체 밖으로 선택 PeopleInfo
엔티티를 실제로 사용할 필요가 없습니다 .Fetch
의 모든 철수하는 Address
필드.
session.QueryOver<PeopleInfo>()
.Left.JoinQueryOver(
x => x.Addresses, () => addressAlias, addressRestriction)
.Fetch(x => x.EmailAddresses).Eager
.Fetch(x => x.PhoneNumbers).Eager
.Where(x => x.Id == contactInfoId)
.SingleOrDefault();
Address
열이 포함되어 SELECT
당신이에 가입했기 때문에 절 Address
전체 밖으로 선택하는 PeopleInfo
클래스를.
둘 다 동일한 SQL을 생성하지만 프로파일 러에서 확인해야합니다. 다음과 같이 보일 것입니다.
SELECT this_.* -- All PeopleInfo columns
addressali1_.*, -- All Address columns
emailaddre4_.* -- All email address columns
FROM PeopleInfo this_
LEFT OUTER JOIN address addressali1_
ON this_.id = addressali1_.personid
AND ( addressali1_.active = 1)
LEFT OUTER JOIN emailaddress emailaddre4_
ON this_.id = emailaddre4_.personid
WHERE this_.id = <your id>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다