【问题标题】:Getting this exception: "DbSortClause expressions must have a type that is order comparable. Parameter name: key"出现此异常:“DbSortClause 表达式必须具有顺序可比较的类型。参数名称:键”
【发布时间】: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 作为解决方案。

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

【问题讨论】:

    标签: c# asp.net-mvc entity-framework linq automapper


    【解决方案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 对查询进行排序的,并确保它是按对排序有意义的东西进行排序的。我知道这有点含糊,但我希望它对将来遇到此错误的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多