2013-05-15 143 views
0

我是NHibernate的新手& LINQ。我有一段我認爲可以優化的代碼。請幫助我這樣做。需要使用Nhibernate優化LINQ代碼

foreach (var geography in geographyList.OrderBy(x => x.Name)) 
{ 

    var introductionDateDetail = environment.IntroductionDateInfo 
             .IntroductionDateDetails 
             .OrderByDescending(x => x.ApplicationDate) 
             .FirstOrDefault(x => x.Geography.Id == geography.Id && 
                  x.VaccineDetail.Id == vaccineDetail.Id && 
                  x.MasterForecastInfo.Id == masterforecast.Id && 
                  x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id); 

} 

for循環迭代可以約一千records.And因此LINQ語句也執行的許多倍。我們可以寫一段代碼,我們可以只執行一次LINQ語句嗎?

+0

這看起來像N + 1查詢問題的情況下。地理和IntroductionDetails和IntroductionDetailsInfo之間是否有外鍵?然後,您可以使用'Fetch'方法在獲取地理位置時切實加載這些介紹細節。如果不是 - 您可以始終執行一個查詢以獲取所有介紹詳細信息,其中'geographyIds.Contains(x.Geography.Id)' – Pako

+0

否Geography與IntroductionDetails和IntroductionDetailsInfo之間沒有外鍵。請你能更具體地做一個查詢來獲得所有介紹細節嗎? – user2299182

回答

0

你可以嘗試這樣的事情:

var geographiesId = geographyList.Select(g => g.Id); 
var introductionDetails = environment.IntroductionDateInfo 
            .IntroductionDateDetails 
            .OrderByDescending(x => x.ApplicationDate) 
            .FirstOrDefault(x => geographiesId.Contains(x.Geography.Id) && 
                 x.VaccineDetail.Id == vaccineDetail.Id && 
                 x.MasterForecastInfo.Id == masterforecast.Id && 
                 x.ViewInfo.Id == viewInfoDetail 
+0

謝謝Pako,幫了我很多 – user2299182

+0

沒問題。從ORM開始有時會很難並且表現不佳,但大部分時間只是瞭解正在發生的事情並尋找其他方式來解決問題。祝你好運! – Pako

+0

是的。如果我想在實體有外鍵引用的時候急於加載上面的LINQ查詢呢? – user2299182