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
我的代码:
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;
注意:如果在Foo的ToString()方法上有覆盖,您将获得相同的行为事件。