Entity Framework: объединение таблицы dbcontext со списком делает поиск очень медленным - PullRequest
1 голос
/ 12 июня 2019

Сначала в своем запросе я пытаюсь получить только 500 рыночных записей каждый раз (PageSize = 500). Поэтому в идеале я должен получать подсистемы только для тех 500 рыночных рекордов. Вот почему в запросе «подсистем» я пытаюсь присоединиться к отфильтрованному списку рыночных рекордов. Этот запрос очень медленный. Затем я попытался соединиться напрямую с dbContext.tblfitems в запросе «subsytems1». Этот запрос быстрее, чем первый. Но я присоединяюсь ко всем записям в fitems (marketrecords). В идеале второе должно быть медленным, так как объединение с тысячами записей, но в более раннем случае это только 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 Ответ

1 голос
/ 12 июня 2019

Проблема в том, что при присоединении IQueryable к списку в памяти запрос перетаскивает всю таблицу tblfsubsystems в память, поэтому ваш запрос медленный.Простое решение не состоит в том, чтобы материализовать первый список и сохранить его как IQueryable.Поэтому удалите ToList с конца и используйте var для упрощения кода, например:

var maketRecords = _dbContext.tblfitems
    .Where(x => x.MarketId == marketId)
    .OrderBy(x => x.RecordId)
    .Skip((pageIndex - 1) * PageSize)
    .Take(PageSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...