LinQ-尝试按子属性排序时出错

LinQ-尝试按子属性排序时出错,linq,.net-core,Linq,.net Core,我正在尝试获取一个对象列表,其中包含另一个具有LinQ的Child列表。 我需要按父级顺序,然后按子级顺序对这个对象进行排序。 这是我的代码: public async Task<IEnumerable<Menus>> GetMenus(string modulo) { var result = this.context.Set<Menus>() .Include(det => det.MenusSub)

我正在尝试获取一个对象列表,其中包含另一个具有LinQ的Child列表。 我需要按父级顺序,然后按子级顺序对这个对象进行排序。 这是我的代码:

public async Task<IEnumerable<Menus>> GetMenus(string modulo)
    {
        var result = this.context.Set<Menus>()
            .Include(det => det.MenusSub)
            .Where(e => e.Modulo.Equals(modulo))
            .OrderBy(s => s.Orden).ThenBy(s => s.MenusSub.OrderBy(p => p.Orden));

        return await result.ToListAsync();
    }
公共异步任务获取菜单(字符串模)
{
var result=this.context.Set()
.Include(det=>det.MenusSub)
其中(e=>e.模等于(模))
.OrderBy(s=>s.Orden),然后是by(s=>s.MenusSub.OrderBy(p=>p.Orden));
返回等待结果。toListSync();
}
问题来自thenBy,因为执行此查询时返回以下错误:

“消息”:“无法比较数组中的两个元素。”, “StackTrace”:“在System.Collections.Generic.GenericArraySortHelper
1.Sort(T[]键,Int32索引,Int32长度,IComparer
1比较器)\r\n在System.Array.Sort[T](T[]数组,Int32索引,Int32长度,IComparer
1比较器)\r\n在System.Linq.EnumerableSorter
1.Sort(TElement[]元素,Int32计数)\r\n位于System.Linq.OrderedEnumerable
1.GetEnumerator()+MoveNext()\r\n位于System.Linq.OrderedAsyncEnumerable
2.MoveNextCore(CancellationToken CancellationToken)\r\n位于System.Linq.AsyncEnumerable.AsyncIterator
1.MoveNext(CancellationToken CancellationToken CancellationToken)\r\n在Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.AsyncSelectEnumerable上\r\n位于System.Linq.AsyncEnumerable.AsyncIterator
1.MoveNext(CancellationToken CancellationToken)\r\n位于Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken CancellationToken)\r\n位于System.Linq.AsyncEnumerable.Aggregate_[TSource,TAccumulate,TResult](IAsyncEnumerable
1源,TAccumulate种子,Func
3累加器,Func
2结果选择器,CancellationToken CancellationToken)\r\n位于Ohmio.Data.MenusRepository.GetMenus(字符串模)在C:\Users\ericp\Documents\Mis Proyectos\Ohmio WEB\Ohmio WEB server\OhmioData\Repositorios\MenusRepository.cs:C:\Users\ericp\Documents\Mis Proyectos\Ohmio WEB\Ohmio WEB server\ohmioservices\MenusService.cs:Ohmio.Api.Controladores.MenusController.getmenuscontroller中的第42行\r\nC:\Users\ericp\Documents\Mis Proyectos\Ohmio WEB\Ohmio WEB server\OhmioWEBAPINetCore\ControlAdors\MenusController.cs中的(字符串模数):Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()第26行\r\n Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()中的InvokeActionMethodAsync()\r\n位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext上下文)\r\n位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态和下一步,范围和范围,对象和状态,布尔值和已完成)\r\n位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()\r\n位于Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()

如果我删除thenBy语句,一切正常


有什么想法吗?谢谢!

我相信问题在于
s.MenusSub.OrderBy(p=>p.Orden)
正在返回一个对象集合。由于您的自定义对象可能没有实现
IComparable
IComparable
,因此它会抛出您看到的异常,这是有意义的,因为它不知道如何比较
菜单类型的两个实例。在.Net中没有一个集合类型实现
>i可比较
接口

相反,您需要删除
ThenBy
,并在
return
语句中使用投影。如下所示:

返回等待结果。选择(r=>
新菜单
{
//指定菜单属性
MenusSub=r.MenusSub.OrderBy(p=>p.Orden)
}).ToListAsync();
或者,您可以将父级已排序的集合加载到内存中,然后返回子级已排序的结果:

foreach(结果中的变量菜单)
{
menu.MenusSub=menu.MenusSub.OrderBy(p=>p.Orden);
}

可能是try
.OrderBy(s=>s.Orden)。然后是by(s=>s.MenusSub.Select(p=>p.Orden))
谢谢Mohsin,但是没有,我得到了相同的错误“无法比较数组中的两个元素”。如何根据
s.MenusSub.OrderBy(p=>p.Orden)的结果进行排序
--这不是某种形式的吗?好的,谢谢Matt。我只需要修改您对menu.MenusSub=menu.MenusSub.OrderBy(p=>p.Orden.ToList();)的说明。请找出使用.Include语句的net core急切加载不支持对子集合属性进行筛选或排序