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

我使用Linq实体我有以下查询

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

但我得到了

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

参数名称:密钥

错误,它返回0 colletction。

对此有任何想法。

.OrderBy()在处理数据库时,应该接受一个委托,该委托只返回表示数据库中一列的单个属性。 我不确定你要做什么,但它看起来像

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

将返回无法排序的值的枚举。

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

你的代码:

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

我的代码:

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

巧合:

*.OrderBy(m => m.Roles)

解:

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

可能的问题是什么原因:

也许,你做了我做的事情,并导致1个用户/成员在同一成员资格中拥有多个角色。 这与OrderBy()发生了冲突,因为应用程序当时只能“命令”一个元素,当她调用Role(这是元素的ICollection)时,而是接收多个元素而没有任何优先级的元素级别(即使我们可以假设应用程序将角色的索引作为优先级的基础级别,实际上它不会)。

解决方案的解释:

当你添加*.Select(r => r.RoleId) ,你要指定应用程序将哪个元素用于OrderBy()。 但是,正如您在此时可能会看到的那样,仅使用*.Select(r => r.RoleId)可能还不够,因为应用程序仍在接收具有相同优先级的多个结果。 添加*.Select(r => r.RoleId).FirstOrDefault()你基本上是在说:“……我不关心从这个元素收到多少结果,只关注第一个结果,或者命令它们默认情况下……“(默认通常表示EMPTY或NULL)。

附加信息:

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

在我的情况下,我不小心尝试按对象排序,而不是按其中一个属性排序。

你应该使用

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

代替

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

注意:如果在FooToString()方法上有覆盖,您将获得相同的行为事件。