使用EF Core的“包含子项”中的OrderBy

时间:2019-02-25 03:25:32

标签: 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;
    }

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

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

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;
}

答案 2 :(得分:-1)

var结果= loadingInMemory.Result.Children.OrderBy(c => c.Sequence).ToList();

您需要在末尾添加ToList()