2013-05-15 54 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