出现此异常:“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 【问题描述】:我有一些名为Box
es 的对象,我正试图在表格中列出这些对象。为此,我使用 Automapper 将它们映射到我的BoxedElectrodesRowModel
。但是,我遇到了很多麻烦,因为每个Box
中都嵌套了另一个对象,称为SerialNumber
。
具体来说,尝试将每个Box
的SerialNumber
s 中的SerialNumberName
s 列表映射到我的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异常