DbSortClause表达式的类型必须是顺序可比较的参数Name:Key



我正在使用Linq实体,并有以下查询

IQueryable<DomainModel.User> userResult = 
      userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));

但是我得到这个错误

DbSortClause表达式必须具有顺序可比较的类型

参数名称:键

,返回一个空集合。

知道是怎么回事吗?

. orderby()在处理数据库时,应该接受一个委托,该委托只返回一个代表数据库中一列的属性。我不知道你想做什么,但它看起来像

u.UserClientRoles.OrderBy(r => r.Role.RoleName)

将返回一个不能排序的值枚举。

我有同样的问题,我用这个解决它:

代码:

IQueryable<DomainModel.User> userResult = userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));

我代码:

List<Membership> results = new List<Membership>();results.AddRange(memberships.OrderBy(m => m.Roles));memberships = results.AsQueryable();

巧合:

*.OrderBy(m => m.Roles)

解决方案:

*.OrderBy(m => m.Roles.Select(r => r.RoleId).FirstOrDefault())

可能的问题原因:

也许,你做了我所做的,并导致一个用户/成员可以在同一个成员中有多个角色。这与OrderBy()产生了冲突,因为应用程序当时只能"排序"单个元素,当她调用Role(这是元素的集合)时,而是接收超过1个没有优先级级别的元素(即使我们可以假设应用程序将角色的索引作为优先级的基本级别,实际上它不是)。

解决方案的解释:

当您添加*.Select(r => r.RoleId)时,您正在向应用程序指定哪个元素将用于OrderBy()。但是,正如您将看到的,当您到达这一点时,仅仅使用*.Select(r => r.RoleId)可能是不够的,因为应用程序仍然接收具有相同优先级级别的多个结果。加上*.Select(r => r.RoleId).FirstOrDefault(),你基本上是在说:"……我不关心你从该元素中收到了多少结果,只关注第一个结果,或者按默认顺序排列它们……"(默认是EMPTY或NULL)。

附加信息:

我用非官方的简单概念/含义来解释一个简单的词来解释一个复杂的解决方案,这意味着你可能会有问题,在网上找到类似的帖子使用这个"答案"中使用的词/概念。否则,代码本身就可以工作,您自己应用它和/或修改它应该不会有任何问题。祝你好运! !(^ _ ^)

在我的例子中,我不小心尝试按对象排序,而不是按它的一个属性排序。

你应该使用

var query = from Foo in Bar
            orderby Foo.PropertyName
            select Foo;
不是

var query = from Foo in Bar
            orderby Foo
            select Foo;

注意:如果在FooToString()方法上有一个重写,您将得到相同的行为事件。

最新更新