2009-02-12 44 views
3

如果可能,我期待在單個數據庫查詢中執行以下操作。如何從其父項返回一個集合的第一個對象

public class Location 
{ 
    public string URL {get;set;} 
    public IList<Page> Pages {get;set;} 
} 

Page firstPage = Session.Linq<Location>() 
       .Where(location => location.URL == "some-location-url") 
       .Select(location => location.Pages).FirstOrDefault(); 

我的目標是基於當前位置url,從其頁面集合中返回第一個頁面對象。

我已經嘗試了很多不同的方式,他們似乎都執行了許多查詢來獲得所需的頁面對象。

任何幫助表示讚賞!

戴夫忍者

回答

0

這可能是你想找的:

Page firstPage = Session.Linq<Page>() 
.OrderBy(page => page.Index) 
.FirstOrDefault(page=> page.Location.URL == "some-location-url"); 

我做的網頁有涉及回位置屬於與一個位置屬性的假設。索引將是您想要訂購的財產。

+0

是的,但是從位置集合加載的原因是頁面是有序列表。 我需要能夠從該有序列表中返回第一頁。 – 2009-02-12 14:28:08

+0

我之前通過將索引公開爲僅獲取(由Access.AsCamelCaseField(Prefix.Underscore)設置)來實現此目的。 不理想,但看起來像是唯一的前進方式。 爲確認Chris而歡呼 – 2009-02-12 14:45:19

0

Page運行查詢,而不是對Location運行查詢:根本不需要返回Location記錄。

(from p in AllPages 
where p.Location.URL == "some-location-url" 
select p).FirstOrDefault(); 

[幾乎總是當我被卡住寫一個LINQ查詢,我發現它有助於開始建立從所涉及的父子關係最底層的對象的查詢。]

+0

感謝您的快速響應。正如我評論Chris的回答,Page集合是一個有序列表,所以我需要確保從位置頁集合 – 2009-02-12 14:31:35

0

莫非你不直接通過集合的映射添加訂單。你可以這麼做

Page firstPage = Session.Linq<Location>() 
       .Where(location => location.URL == "some-location-url") 
       .Select(location => location.Pages.FirstOrDefault()).FirstOrDefault(); 

FirstOrDefault可能會停止NHibernate做出所有的選擇。

沒有保證,因爲我沒有linq到nhibernate設置來測試它。

相關問題