2013-02-05 2 views
3

nhibernate를 사용하고 있으며 linq 쿼리를 작성했으며 예상 한 결과를 반환하지 않습니다.First/FirstOrDefault가 예상대로 작동하지 않습니다.

public ParentA() 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
    public virtual IList<ChildA> ChidrenA {get; set;} 

    public ParentA() 
    { 
     ChidrenA = new List<ChildA>();  
    } 
} 

public ChildA() 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
    public virtual IList<ChildB> ChidrenB {get; set;} 
    public virtual ParentA ParenteA {get; set;} 
    public ChildA() 
    { 
     ChidrenB = new List<ChildB>();  
    } 
} 

public ChildB() 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
    public virtual ChildA {get; set;} 
} 

위 코드는 내 도메인입니다. 유창한 nhibernate는 매우 기초적 일 것이고 특별한 일이 없기 때문에 나는 그것을 포함시키지 않았다.

내가 가진 쿼리는 내가 뭔가를 1 개 또는 0 상위 기록을 찾을 수

일어날 것으로 예상 무엇

base.unitOfWork.Session.Query<ParentA>() 
    .Where(x => x.Id == parentAId) 
    .FetchMany(x => x.ChildrenA) 
    .ThenFetchMany(x => x.ChildrenB) 
    .FirstOrDefault(); 

입니다. 하나의 레코드를 찾으면 열심히 모든 ChildrenA를로드 한 다음 모든 ChildrenB를로드합니다.

일어나고 그것은 1 개 또는 0 상위 기록을 찾아 무엇

. 그런 다음 ChildrenA 및 ChildrenB에 대해 1 또는 0 레코드 만 사용합니다.

왜 ChildrenA와 ChildrenB에 대해 처음으로 발견 된 기록 만 가져 가고 있습니까?

FirstToDefault()에서 .toList()으로 변경하면 예상 한 모든 결과를 얻지 만 그 부모 레코드가있는 레코드가 하나 뿐이므로 무의미한 것으로 나타납니다.

+0

FirstOrDefault를 Where,하지만 FetchMany 명령문 앞에 두어 본 적이 있습니까? –

+0

@AaronHawkins - 나중에 할 수 없습니다. 그렇게하면 가져 오기를 사용할 수 없습니다. – chobo2

답변

2

직접 .Where 절 이후에 .FirstOrDefault 이동하십시오 : 사실

.Where(x => x.Id == parentAId).FirstOrDefault()... 
+5

그럼'.Where()'를'FirstOrDefault()'로 대체 할 수도 있습니다. 기본적으로 똑같은 일을하기 때문입니다. FirstOrDefault (x => x.Id == parentAId) ... – LazyTarget

+0

@LazyTarget : 아주 좋은 점 : – mellamokb

+0

그게 내가 생각하고 FirstOrDefault()를 어디로 옮기려고했는데, 그 다음에는 가져 오기를 잃어 버렸습니다. 그것은 내가 그들을 사용하게하지 않을 것이다. – chobo2

2

당신이 어디를 필요 없어요 ... 먼저 또는 기본 그래서 대신 어디의 람다 식

.FirstOrDefault(x => x.Id == parentAId). 

소요를의를 사용 위의 문장

+0

나는 그것을 몰랐다. 그게 내 문제를 해결하면 시도해 볼게. – chobo2

관련 문제