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

时间:2012-01-05 07:13:08

标签: c# entity-framework

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

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

但我得到了

  

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

     

参数名称:密钥

错误,它返回0 colletction。

关于此的任何想法。

3 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:9)

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

您的代码:

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())

可能出现问题的原因:

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

解决方案的解释:

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

其他信息:

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

答案 2 :(得分:3)

在我的情况下,我不小心试图通过一个对象来订购,而不是通过其中一个属性进行排序。

你应该使用

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

而不是

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

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