0

可以帮我优化下面的LINQ语句。我使用 NHibernate 作为 ORM。该语句的执行时间超过一分钟。不应该花那么多时间。

 var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails
                                .OrderByDescending(x => x.ApplicationDate)
                                .Where(x => x.VaccineDetail.Id == vaccine.Id &&
                                            x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id &&
                                            x.MasterForecastInfo.Id == scenarioId &&
                                            x.IsIntroductionDateValid == false)
                                .ToList();

谢谢

4

3 回答 3

1
var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails.Where(
                        x => x.VaccineDetail.Id == vaccine.Id && x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id && x.MasterForecastInfo.Id == scenarioId && x.IsIntroductionDateValid == false).OrderByDescending(x => x.ApplicationDate).ToList();

先找,再下单

于 2013-04-26T06:35:43.713 回答
1

需要考虑的一些事项:

  • 请将分析器附加到您的数据库并告诉我们发送到数据库的确切语句
  • 找出语句执行速度是否缓慢或 nHibernate 处理是否需要时间
  • 如果是数据库查询:针对语句进行优化(例如索引、执行计划……)
  • 如果执行了太多查询:对抗 n+1
  • 如果是 nHibernate 执行:关闭 nHibernate 日志记录

请让我们知道有什么意义。

问候,迈克尔

于 2013-04-26T12:49:28.397 回答
1

Where子句移到前面OrderByDescending以减少参与 order by 语句的记录数。喜欢

var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails
                               .Where( x => x.VaccineDetail.Id == vaccine.Id && 
                                     x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id && 
                                     x.MasterForecastInfo.Id == scenarioId && 
                                     x.IsIntroductionDateValid == false)
                                .OrderByDescending(x => x.ApplicationDate)
                                .ToList();

你也可以改变

 x.IsIntroductionDateValid == false

 !x.IsIntroductionDateValid 

但这不会提高性能。只是一个可读的选项。

于 2013-04-26T06:34:25.790 回答