使用 EF Core 包含子项中的 OrderBy

Sup*_*pez 7 c# entity-framework-core

在我的 .NET Core / EF Core 应用程序中,我有一个带有嵌套子对象列表的模型。当我检索一个实例时,我需要按子项的属性之一对嵌套列表进行排序。通过查看 EF Core 上的类似问题和报告的问题,我了解到我无法在检索实例时对嵌套列表进行排序。所以现在我试图在加载到内存中后对其进行排序。但在这里我也没有成功。

我正在使用存储库模式来访问 DbContext。

对此列表进行排序的正确方法是什么,以便它始终从我的存储库中正确返回排序?

我试过的最新:

    public async Task<Parent> GetParent(int id)
    {
        var loadedInMemory = context.Parents
            .Include(p => p.Children)
            .SingleOrDefaultAsync(p => p.Id == id);

        var result = loadedInMemory.Result.Children.OrderBy(c => c.Sequence);
        // When I order within the Task<Parent>, result becomes IOrderedEnumerable 
        // and I can't return it.

        return await result;
    }
Run Code Online (Sandbox Code Playgroud)

小智 8

从 Entity Framework Core 5.0 开始,您可以直接在语句中排序 ( OrderBy) 和过滤器 ( Where) Include(有一些限制)。请参阅Microsoft 文档

因此,您的陈述可以简化为:

    public async Task<Parent> GetParent(int id)
    {
        return await context.Parents
            .Include(p => p.Children.OrderBy(c => c.Sequence))
            .SingleOrDefaultAsync(p => p.Id == id);
    }
Run Code Online (Sandbox Code Playgroud)

在我看来,这是 EF Core 向前迈出的一大步。

  • 这是 EF Core 向前迈出的一大步 - 我已经记不清这些年来我有多少次想要这个了 (2认同)

see*_*per 7

您尝试返回的结果是子项的有序列表。那不是你想要的。而是对子项进行排序,然后返回父项:

public async Task<Parent> GetParent(int id)
{
    var parent = context.Parents
        .Include(p => p.Children)
        .SingleOrDefaultAsync(p => p.Id == id);

    parent.Result.Children = parent.Result.Children.OrderBy(c => c.Sequence).ToList();

    return await parent;
}
Run Code Online (Sandbox Code Playgroud)