出现此异常:“DbSortClause 表达式必须具有顺序可比较的类型。参数名称:键”

Posted

技术标签:

【中文标题】出现此异常:“DbSortClause 表达式必须具有顺序可比较的类型。参数名称:键”【英文标题】:Getting this exception: "DbSortClause expressions must have a type that is order comparable. Parameter name: key" 【发布时间】:2017-06-03 13:55:13 【问题描述】:

我有一些名为Boxes 的对象,我正试图在表格中列出这些对象。为此,我使用 Automapper 将它们映射到我的BoxedElectrodesRowModel。但是,我遇到了很多麻烦,因为每个Box 中都嵌套了另一个对象,称为SerialNumber

具体来说,尝试将每个BoxSerialNumbers 中的SerialNumberNames 列表映射到我的BoxedElectrodesModel 中的SerialNumber 字符串列表似乎会导致很多问题。

这是 AutoMapper 代码:

c.CreateMap<Box, BoxedElectrodesRowModel>()
    .ForMember(dest => dest.BoxId, opts => opts.MapFrom(src => src.BoxID))
    .ForMember(dest => dest.SerialNumbers, opts => opts.MapFrom(src => src.SerialNumbers.Select(t => t.SerialNumberName)))
    .ForMember(dest => dest.DateCreated, opts => opts.MapFrom(src => src.DateCreated));

这是发生异常的代码,在我的 IQueryableExtensions.cs 文件中

public static DataTablesResponse ToDataTablesResponse<TDataModel, TJsonModel>(this IQueryable<TDataModel> data,
    IDataTablesRequest param, IConfigurationProvider cfgProvider)

    int totalCount = (data == null) ? 0 : data.Count();
    if (totalCount == 0)
    
        return new DataTablesResponse(param.Draw, Enumerable.Empty<TJsonModel>(), 0, 0);
    

    var rows = data.ProjectTo<TJsonModel>(cfgProvider);

    // Apply search
    var searchableColumns = param.Columns
        .Where(c => c.Searchable == true)
        .Select(c => c.Data)
        .ToArray();
    var filteredRows = rows.FilterOnColumns(searchableColumns, param.Search.Value);

    // Apply sorting
    var sortedColumns = param.Columns.GetSortedColumns()
        .ToDictionary(
            sc => sc.Data,
            sc => sc.SortDirection == Column.OrderDirection.Ascendant
        );
    var sortedRows = filteredRows.OrderByColumns(sortedColumns);

    // Apply pagination
    var pagedRows = sortedRows
        .Skip(param.Start)
        .Take(param.Length)
        .ToList();

    return new DataTablesResponse(param.Draw, pagedRows, filteredRows.Count(), totalCount);

错误,

DbSortClause 表达式必须具有顺序可比的类型。 参数名称:key

出现在底部的// Apply pagination 部分。我对这个项目还很陌生,不知道是什么导致了这个错误的发生。

经过一番研究,我找到了一个潜在的解决方案,即在 Automapper 代码的序列号行末尾添加.FirstOrDefault()。但是,这导致了新的错误:

缺少从 System.Char 到 System.String 的映射。使用创建 Mapper.CreateMap

因为 Automapper 试图映射每个字符串的 FirstOrDefault character 而不是字符串列表中的第一个。所以现在,我决定取消添加 FirstOrDefault 作为解决方案。

任何其他想法如何解决这个问题?

【问题讨论】:

【参考方案1】:

我在以下查询中遇到了同样的错误:

var pagingModel = new PagingModel();

var data = _context.Parents
    .Select(p => new ParentDto
    
        ParentProp = p.ParentProp,
        Children = p.Children
            .Select(c => new ChildDto
            
                ChildProp = c.ChildProp
            )
            .ToList()
    )
    .PageAsync(pagingModel);
public class PagingModel

    public int? PageSize  get; set; 
    public int PageNumber  get; set; 
    public string SortProperty  get; set; 
    public bool Descending  get; set; 

PageAsync 方法来自我无权访问源代码的库。目的是它处理分页,包括按命名属性排序,但我不知道它是如何做到这一点的内部结构。大概是关于它的实现的一些东西给出了错误,这和你的一样:

System.ArgumentException:DbSortClause 表达式必须具有顺序可比的类型。 (参数'key')

我通过为查询指定 SortProperty 来解决此问题:

var pagingModel = new PagingModel

    SortProperty = "ParentProp"
;

这大概是通过适当的方式明确地对查询进行排序。我不知道它以前是如何尝试订购的。

我怀疑您的 OrderByColumns 方法中一定发生了类似的事情。结果是您需要弄清楚实际上是如何告诉 LINQ 对查询进行排序的,并确保它是按对排序有意义的东西进行排序的。我知道这有点含糊,但我希望它对将来遇到此错误的人有所帮助。

【讨论】:

以上是关于出现此异常:“DbSortClause 表达式必须具有顺序可比较的类型。参数名称:键”的主要内容,如果未能解决你的问题,请参考以下文章

出现异常“IllegalStateException:onSaveInstanceState 后无法执行此操作”

当我尝试使用 Laravel 控制器方法处理 AJAX 请求时,为啥会出现此异常?

执行Linux脚本,出现No Such file or directory异常

以前工作的 iframe 中出现“Chrome 检测到异常代码”错误

为啥颤振本地通知会出现异常

构建失败并出现异常