У меня есть запрос, который выглядит следующим образом:
users = ctx.SearchedUsers.AsNoTracking()
.IncludeEFU(ctx,c=>c.SearchedUserItems)
.IncludeEFU(ctx,c=>c.UserTransactions)
.Where(y => y.InQueue == false &&
y.LastTimeSearchedAt.Value > inPast10Dayss)
.OrderBy(y => y.LastUpdatedAt)
.Take(100).ToList();
Метод IncludeEFU()
вызывается из библиотеки EFUtilities, которую я получил отсюда:
https://github.com/MikaelEliasson/EntityFramework.Utilities
И другая версия этого запроса (с использованием обычного include) выглядит так:
users = ctx.SearchedUsers.AsNoTracking()
.Include("SearchedUserItems")
.Include("UserTransactions")
.Where(y => y.InQueue == false &&
y.LastTimeSearchedAt.Value > inPast10Dayss)
.OrderBy(y => y.LastUpdatedAt)
.Take(100).ToList();
Теперь оба этих запроса дают ужасные результаты производительности, когда взятие 100 записей из таблицы SearchedUsers
и примерно от 2000 до 5000 записей в двух соседних таблицах SearchedUserItems
и UserTransactions
занимает от 2 до 5 минут. ...
То, что я сделал ранее, это извлечение записей для каждой записи из таблицы SearchedUser
, а затем извлечение соседних записей через FK (который индексируется в обеих таблицах для повышения производительности).
Теперь мой вопрос здесь ... Есть ли более быстрый способ включить эти записи в один запрос, чтобы мне не приходилось извлекать их одну за другой эффективным способом?
Может кто-нибудь мне помочь?