首先在查询中,我每次尝试仅获得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();
答案 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);