c# - 帮助优化这个linq语句

标签 c# linq automapper

请帮助我优化此 linq 语句以提高性能。大约有 4000 个驱动程序要经过,页面超时。 我对 Linq 比较陌生

tblDriver driver = Mapper.Map<Domain.Driver, tblDriver>(driverDto);

var entries = (from e in driver.tblDriverLogEntries
                where e.OccuredAt <= utcEnd &&
                e.OccuredAt >= utcViolationsStart &&
                e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0
                select e).Union(
                    //previous amended status
                    (from e in driver.tblDriverLogEntries
                        where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0
                        && e.OccuredAt < utcViolationsStart
                        orderby e.OccuredAt descending
                        select e).Take(1).Union(
                            //next amended status
                            (from e in driver.tblDriverLogEntries
                                where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0
                                && e.OccuredAt > utcEnd
                                orderby e.OccuredAt ascending
                                select e)
                            )
                    );

最佳答案

where e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0

当您应该使用 Any() 时,您正在使用 Count() > 0:这至少会给您一些加速(在您的查询中出现 3 次) :

 where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue)

您可能还想预定义并获取此查询的结果,这样您就不必重新查询 3 次,即:

var subset = (from e in driver.tblDriverLogEntries 
             where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue)
             select e).ToList();

 var entries = (from e in subset 
                where e.OccuredAt <= utcEnd &&
                e.OccuredAt >= utcViolationsStart 
                select e).Union(
                //previous amended status
                (from e in subset
                 where e.OccuredAt < utcViolationsStart
                 orderby e.OccuredAt descending
                 select e).Take(1).Union(
                 //next amended status
                 (from e in subset
                  where e.OccuredAt > utcEnd
                  orderby e.OccuredAt ascending
                  select e)));

关于c# - 帮助优化这个linq语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440056/

相关文章:

c# - 通过 Webhook C# 发送 Discord 嵌入

linq - 使用 OData 和 LINQ 获取链接集合的计数

c# - 无法进入或中断在 Linq 查询/表达式中调用的方法

c# - 单元测试自动映射器

C# 使用代码对程序集进行签名

c# - 如何在 C# .NET 中计算 CPU 平均负载

c# - Entity Framework 在哪里存储属性名称和它在 SQL 中选择的列之间的映射?

c# - 在独立的可重用库中的 AutoMapper 中创建 map 的推荐方法是什么?

c# - 将 IQueryable 映射到 .NET 中 OData 的域模型

c# - 在 MS 单元测试 (.NET Core) 中设置 System.Diagnostics.Activity.Current