2013-02-05 50 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將是非常基本的,沒有什麼特別的,所以我沒有包括它。

查詢我是

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

我希望發生

它會找到1或0的父記錄。如果確實找到了一條記錄,它將急切地加載所有ChildrenA,然後加載所有ChildrenB。

發生了什麼

它發現1或0的父記錄。然後它只需要1或0條記錄給ChildrenA和ChildrenB。

爲什麼只爲兒童A和兒童B取得第一個記錄?

如果我將FirstToDefault()更改爲.toList()我收到了我所期望的一切,但我發現它毫無意義,因爲應該只有一條記錄帶有該父記錄。

+0

您是否曾嘗試將FirstOrDefault放在Where,但在FetchMany語句之前? –

+0

@AaronHawkins - 你不能那樣做。如果我這樣做,那麼我不能使用Fetches。 – chobo2

回答

2

嘗試移動.FirstOrDefault直接在.Where條款後:

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

然後你可以用'FirstOrDefault()'替換'.Where()',因爲它基本上做同樣的事情。 FirstOrDefault(x => x.Id == parentAId)... – LazyTarget

+0

@LazyTarget:非常好的點:) – mellamokb

+0

雅這就是我想到的,並試圖將FirstOrDefault()移到之後,但後來我失去了提取。它不會讓我使用它們。 – chobo2

2

其實你不需要在哪裏?首先或默認採用lambda表達式

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

因此,而不是在哪裏,使用以上聲明

+0

我不知道。我會盡力解決我的問題。 – chobo2