【问题标题】:Trying to Customize OrderBy with IQueryable - "Skip" method error尝试使用 IQueryable 自定义 OrderBy -“跳过”方法错误
【发布时间】:2011-02-16 20:30:43
【问题描述】:

我的代码的第一部分获取 IQueryable 数据结果:

var issues = repository.GetAllIssues().Where(i => 
                  i.IssueNotificationRecipients.Any(r => r.Status == "Open"));

然后我确定用户请求的排序顺序,并添加它:

switch (sort)
{
case 1:
    issues.OrderBy(x => x.Customer);
    break;
case 2:
    issues.OrderBy(x => x.Description);
    break;
case 3:
    issues.OrderBy(x => x.CreatedBy);
    break;
default:
    issues.OrderBy(x => x.DueDateTime);
    break;
}

这会引发错误:

仅支持“跳过”方法 用于 LINQ to Entities 中的排序输入。 必须调用方法“OrderBy” 在方法“跳过”之前

那么如何动态添加 OrderBy 以响应用户的输入?

【问题讨论】:

    标签: c# linq sql-order-by skip


    【解决方案1】:

    你是不是想说

    switch (sort)
    {
    case 1:
        issues = issues.OrderBy(x => x.Customer);
        break;
    case 2:
        issues = issues.OrderBy(x => x.Description);
        break;
    case 3:
        issues = issues.OrderBy(x => x.CreatedBy);
        break;
    default:
        issues = issues.OrderBy(x => x.DueDateTime);
        break;
    }
    

    您可能需要更改issues 的类型,或将其设置为新变量,因为它返回IOrderedQueryable<T>

    【讨论】:

      【解决方案2】:

      您尚未向我们展示您的所有代码,但一个问题是您希望 issues.OrderBy(..)issues 变量引用的可查询对象进行变异。但它实际上并没有这样做。它返回一个新的IOrderedQueryable,它表示原始可查询的有序版本。

      由于您的订购操作实际上并未触及被称为issues 变量的可查询变量;在它上面调用Skip 会导致你得到错误是有道理的,因为它还没有实际上被排序了。

      你可能想这样做:

      issues = issues.OrderBy(...);
      

      【讨论】:

      • 这个答案是救命稻草!我在服务类中调用 ToList 的大多数实体,因为我返回少量记录。我开始使用 IQueryable 来返回更大的集合,但我不知道为什么 OrderBy 不起作用。使用不同的变量会返回 IOrderedQueryable,它可以修复所有问题。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 2016-06-18
      • 2018-09-23
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多