【问题标题】:Entity Framework : joining dbcontext table with a List makes retrieval very slow slow实体框架:使用列表加入 dbcontext 表会使检索变得非常缓慢
【发布时间】:2023-03-26 15:09:02
【问题描述】:

在我的查询中,我尝试每次只获取 500 条市场记录 (PageSize=500)。所以接下来理想情况下,我应该只为这 500 个市场记录获取子系统。这就是为什么在“子系统”查询中我尝试加入过滤后的市场记录列表。这个查询非常慢。然后我尝试在 'subsytems1' 查询中直接加入 dbContext.tblfitems 。此查询比第一个查询快。但我加入了 fitems (marketrecords) 中的所有记录。理想情况下,第二个应该很慢,因为 join 有数千条记录,但在早期的情况下,它只有 500 条记录。我只是不想加入所有记录,而是只想加入 500 条记录。我该如何进行?

List<MarketRecord> maketRecords = _dbContext.tblfitems.Where(x => x.MarketId == marketId)
                                                          .OrderBy(x => x.RecordId)
                                                          .Skip((pageIndex - 1) * PageSize)
                                                          .Take(PageSize)
                                                          .ToList();

    List<FSubsystem> subsytems = (from t1 in _dbContext.tblfsubsystems
                                     join t2 in maketRecords on t1.RecordId equals t2.RecordId
                                     where t2.MarketId == marketId
                                     select t1)
                                 .Distinct().OrderBy(x => x.RecordId).ThenBy(y => y.FSubsystemId).ToList();


    List<FSubsystem> subsytems1 = (from t1 in _dbContext.tblfsubsystems
                                  join t2 in _dbContext.tblfitems on t1.RecordId equals t2.RecordId
                                  where t2.MarketId == marketId
                                  select t1)
                                 .Distinct().OrderBy(x => x.RecordId).ThenBy(y => y.FSubsystemId).ToList();

【问题讨论】:

  • 加入内存列表会使查询将整个 tblfsubsystems 表拖入内存。从第一个查询中删除 ToList
  • @DavidG 谢谢大卫。现在工作正常

标签: c# performance entity-framework linq linq-to-sql


【解决方案1】:

问题在于将IQueryable 加入内存列表会使查询将整个tblfsubsystems 表拖到内存中,这就是您的查询速度慢的原因。简单的解决方案是不实现第一个列表并将其保留为IQueryable。所以把最后的ToList去掉,用var简化代码,例如:

var maketRecords = _dbContext.tblfitems
    .Where(x => x.MarketId == marketId)
    .OrderBy(x => x.RecordId)
    .Skip((pageIndex - 1) * PageSize)
    .Take(PageSize);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多