【问题标题】:Linq - Query on 2 Lists OptimizationLinq - 查询 2 个列表优化
【发布时间】:2016-12-02 10:33:32
【问题描述】:

我有 2 个列表,我正在查询这 2 个列表。两个列表都填充了大量数据。所以查询需要很长时间。

当我通常遇到这个性能问题时,我只是简单地转换 SQL 查询并直接运行它们并在数据表中获取结果。但是这次我不能这样做,因为这两个不是表格而是模型列表。

如何优化这个查询或者我应该怎么做?

代码:-

List<TempInOut> listTempInOut = new List<TO_TempInOut>();
List<ShiftSchedule> tempShiftSch  = new List<TO_TempInOut>();

var data = (from B in tempShiftSch
                                    from C in listTempInOut
                                    where
                                        B.CompanyId == companyId &&
                                        C.CompanyId == companyId &&
                                        B.EmployeeId == C.EmployeeId &&
                                        C.InDate >= StrOutStart &&
                                        C.InDate <= StrOutEnd &&
                                        B.ShiftId == item.ShiftCode &&
                                        B.ShiftDate == tempInputDate
                                    select new
                                    {
                                        C.EmployeeId,
                                        C.InDate,
                                        C.Time_Date1
                                    }).ToList();

【问题讨论】:

    标签: sql-server performance linq asp.net-mvc-4


    【解决方案1】:

    为您的类型实现一个 IEqualityComparer,为每个集合使用 HashSet,并使用HashSet.Intersect 方法获取您的输出。

    【讨论】:

      【解决方案2】:

      您可以将查询简化为两个步骤并比较时间。 我正在考虑类似的事情。

      var listTempInOutResult = listTempInOut.Where(C => C.CompanyId == companyId 
                                                     && C.InDate >= StrOutStart 
                                                     && C.InDate <= StrOutEnd);
      var employessIds = listTempInOutresult.Select(x => x.EmployeeId).ToList();
      
      var data = tempShiftSch.Where(B => employessIds.Contains(B.EmployeeId) 
                                     && B.CompanyId == companyId 
                                     && B.ShiftDate == tempInputDate 
                                     && B.ShiftId == item.ShiftCode)
                              .Select(C=> new
                              {
                                C.EmployeeId,
                                C.InDate,
                                C.Time_Date1
                              }).ToList();
      

      【讨论】:

      • @Anup 你试过了吗.. 知道结果很有趣!!
      【解决方案3】:

      如果您使用 iqueryable,最好使用连接。 see this StackOverflow question

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多