OrderBy 子句阻止加载导航属性

OrderBy Clause prevents navigation properties from being loaded

我在投资组合网站上工作,我想在产品页面上显示同一类别的相关文章。

我创建了一种方法,允许我在定义的类别中随机选择定义数量的文章。不幸的是,当我将 OrderBy 子句添加到 "enable" 随机性时,我无法再检索导航属性。

public async Task<IEnumerable<Article>> GetRandomArticlesByCategoryIdAsync(int categoryId, int numberOfArticles)
{
    return await _ptitsBricosContext
        .Articles
        .OrderBy(a => Guid.NewGuid())
        .Include(a => a.Pictures)
        .Where(a => a.Category.Id == categoryId)
        .Take(numberOfArticles)
        .ToListAsync();
}

当我删除 .OrderBy(a => Guid.NewGuid()) 时,我正确地检索了 Pictures 相关的,但是当我再次添加它时,我总是检索到一个空的图片列表(即使我总是有结果)。

我有点卡住了,我不明白为什么它会改变请求的行为。

此问题是由 random 顺序、Take 运算符和子集合 Include 的组合引起的。

EF Core 通过使用 separate 数据库查询处理集合 Includes,将主要 query 与相关 table.

由于本场景中一次查询return条不同的记录,第二次查询join根本就没有return第一次查询结果的相关记录。相关集合可能为空或部分填充。

不幸的是,对于这种情况,我看不到好的解决方法。考虑将其发布到他们的 GitHub 问题跟踪器,看看他们会怎么说。

我看到的唯一相对有效的解决方法是将主查询修改为 return 只有 PK,执行它并使用列表作为实际查询的条件:

var ids = await _ptitsBricosContext
    .Articles
    .OrderBy(a => Guid.NewGuid())
    .Where(a => a.Category.Id == categoryId)
    .Take(numberOfArticles)
    .Select(a => a.Id)
    .ToListAsync();

return await _ptitsBricosContext
    .Articles
    .Include(a => a.Pictures)
    .Where(a => ids.Contains(a.Id))
    .ToListAsync();