在我的.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;
}
答案 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()