实体框架:将dbcontext表与列表结合在一起会使检索非常缓慢

时间:2019-06-12 12:54:41

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

首先在查询中,我每次尝试仅获得500个市场记录(PageSize = 500)。因此,下一个理想情况下,我应该只获取这500个市场记录的子系统。这就是为什么在“子系统”查询中我尝试加入过滤后的市场记录列表的原因。这个查询非常慢。然后,我尝试在'subsytems1'查询中直接与dbContext.tblfitems连接。此查询比第一个查询快。但是我加入了fitems(市场记录)中的所有记录。理想情况下,第二个连接应该慢一些,因为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();

1 个答案:

答案 0 :(得分: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);