Это дефект реализации EF Core 2.1.Ниже приводится обходной путь, но используйте его только в том случае, если у вас действительно есть проблемы с производительностью, потому что для этого требуется сломать абстракцию соединения свойства навигации и использовать ручное соединение, которое, как я всегда говорю, не следует использовать с EF (Core).Также может не работать, если используется для проецирования более чем одной коллекции или как часть более сложного запроса.
Требуется заменить использование свойства навигации по коллекции post.PostDisableCoins
на SelectMany
с использованием бокового соединения и скрытияоператоры OrderBy
/ Take
(обновление с правильными типами и именами PK / FK):
var postDisableCoinsQuery = source.SelectMany(p =>
db.Set<PostDisableCoin>()
.Where(c => c.PostId == p.Id)
.OrderByDescending(c => c.CoinAmount)
.Take(3)
);
Затем выполните GroupJoin
для него:
var query =
from p in source
join c in postDisableCoinsQuery on p.Id equals c.PostId into postDisableCoins
select new PostProject
{
PostDisableCoins = postDisableCoins.ToList(),
WarStartTime = p.WarStartTime,
WarEndTime = p.WarEndTime,
WarWinner = p.WarWinner,
WarDeclarer = post.WarDeclarer
};
При выполнении,приведенное выше приведет к желаемому результату с помощью одного запроса SQL.