【问题标题】:DbSortClause expressions must have a type that is order comparable parameter Name :KeyDbSortClause 表达式的类型必须是 order 可比较参数 Name :Key
【发布时间】:2012-01-05 07:13:08
【问题描述】:

我正在使用 Linq to entity 并有以下查询

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

但是我收到了这个错误

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

参数名称:键

它返回一个空集合。

知道发生了什么吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,你是对的,它返回了值的枚举。那么我怎样才能达到顺序?如果您有任何想法,请告诉我。
    • 如果你能解释一下你希望角色列表如何影响 userResult 的顺序,我可以帮你弄清楚。例如,取列表中的第一个 RoleName,或者角色的计数等。
    • 这句话,“将返回一个无法排序的值的枚举”做了两件事:让我觉得自己像个白痴,没有考虑如何使用集合来订购东西,让我开始思考我真正想用什么来订购我的套装。谢谢!
    【解决方案2】:

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

    你的代码:

    IQueryable&lt;DomainModel.User&gt; userResult = userResult.OrderBy(u =&gt; u.UserClientRoles.OrderBy(r =&gt; r.Role.RoleName));

    我的代码:

    List&lt;Membership&gt; results = new List&lt;Membership&gt;(); results.AddRange(memberships.OrderBy(m =&gt; m.Roles)); memberships = results.AsQueryable();

    巧合:

    *.OrderBy(m =&gt; m.Roles)

    解决方案:

    *.OrderBy(m =&gt; m.Roles.Select(r =&gt; r.RoleId).FirstOrDefault())

    可能的问题原因:

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

    解决方案说明:

    当您添加*.Select(r =&gt; r.RoleId) 时,您正在向应用程序指定将用于OrderBy() 的元素。但是,当您可能到达这一点时,您将看到,仅使用*.Select(r =&gt; r.RoleId) 可能是不够的,因为应用程序仍在接收具有相同优先级级别的多个结果。添加*.Select(r =&gt; r.RoleId).FirstOrDefault() 你基本上是在说:“......我不在乎你从那个元素收到了多少结果,只关注第一个结果,或者默认排序它们......”(默认通常意味着 EMPTY或NULL)。

    附加信息:

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

    【讨论】:

    • 这根本不是一个好主意,因为您将在 .NET 而不是 SQL 中对结果进行排序
    【解决方案3】:

    就我而言,我不小心尝试按对象排序,而不是按其中一个属性排序。

    你应该使用

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

    代替

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多