nhibernate lambda 확장 - 컬렉션의 암살자를 간절히 둔화
-
19-09-2019 - |
문제
소셜 네트워킹 사이트에 대한 기준 쿼리가 있습니다. 사람 객체에는 친구 모음이 있습니다 (또한 사람 대상). 쿼리는 첫 번째 N 친구를 사로 잡지만 관련 객체 MainProfileImage를 열망하고 후속 객체 Mediumnail을 열망하고 싶습니다.
HQL에서 쉽게 할 수 있습니다.
select friends from Person person inner join person.Friends friends inner join fetch friends.MainProfileImage image inner join fetch image.MediumThumbnail where person = :person1 order by friends.LatestLogin desc
내 기준 노력은 다음과 같습니다. 어떤 이유로 든 이것은 아무것도 돌려주지 않습니다!
public static IList<Person> GetFriends(Person person, int count)
{
Person personAlias = null;
Person friendAlias = null;
ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
.CreateCriteria(typeof (Person), () => personAlias)
.CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
.CreateCriteria(() => friendAlias.MainProfileImage, JoinType.InnerJoin)
.CreateCriteria(() => friendAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
.AddOrder(() => personAlias.LatestLogin, Order.Desc)
.Add<Person>(p => p.ID == person.ID)
.SetMaxResults(count);
return criteria.List<Person>();
}
해결책
나는 당신의 진술의 순서로 인해 쿼리가 당신이 얻는 것이 바람직하지 않은 SQL을 생성하게한다고 생각합니다 (따라서 결과는 없음). 다음은 다음과 같습니다.
public static IList<Person> GetFriends(Person person, int count)
{
Person personAlias = null;
Person friendAlias = null;
ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
.CreateCriteria(typeof (Person), () => personAlias)
.CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
.Add<Person>(p => p.ID == person.ID)
.CreateCriteria(() => personAlias.MainProfileImage, JoinType.InnerJoin)
.CreateCriteria(() => personAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
.AddOrder(() => personAlias.LatestLogin, Order.Desc)
.SetMaxResults(count);
return criteria.List<Person>();
}
또한 귀하의 설명에 따르면 MainProfileimage 및 Medium Thumbnail 데이터를 얻으려는 연관성이 명확하지 않습니다. 당신이 당신의 기준 명령문에서 그것을 사용하는 동안 당신은 당신이 당신이 사용하는 것처럼 친구들이 받고있는 주인공 객체에서 나오도록 데이터를 요청하고 있습니다. friendsAlias
. 나는 그것을 사용하도록 변경했다 personAlias
대신에 이것이 당신이 데이터를 연결하려는 의미라고 생각합니다.
제휴하지 않습니다 StackOverflow