【问题标题】:OrderByDescending with Skip and Take in LINQ shows error在 LINQ 中使用 Skip 和 Take 的 OrderByDescending 显示错误
【发布时间】:2013-08-02 05:52:47
【问题描述】:

我的 linq 有点东西

GetPublishedArticleList().Where(x => x.Category.CatName == catName).OrderByDescending(x=>x.PublishedDate).Skip(skip).Take(last);

运行上述代码时出现以下异常

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

我希望 LINQ 了解我需要先按降序对数据进行排序,然后才能应用 Skip 和 Take。 (上面的代码在 OrderByDescending 被 OrderBy 替换时有效)

有人可以给我建议吗?

【问题讨论】:

  • 你能先打电话给Take吗?这将返回一个 IEnumerable(来自 IOrderedQueryable),您可以在其上调用 Skip。如果这会影响您的索引,您可以将其更改为 Take(skip + last).Skip(skip)
  • 哇——这真的很奇怪。 听起来对我来说就像一个错误......
  • @John:不,首先调用Take 会破坏结果......关键是我们这里有一个IOrderedQueryable,而不是IOrderedEnumerable - 我们正在尝试以减少从数据库传输的数据量。
  • @JonSkeet 知道了,我不记得了,我懒得去查文档
  • @JonSkeet 是对的。以防万一有人怀疑 GetPublishedArticleList() 只不过是 context.TableName

标签: c# linq entity-framework linq-to-sql linq-to-entities


【解决方案1】:

这适用于 EF5。 (.net 4.5) 我看不出你的代码有什么问题。 你确定你在测试时有正确的方法序列吗? 源类型是 Iqueryable 还是 Iqueryable ?

public virtual IQueryable<TPoco> GetSortedPageList<TSortKey>(Expression<Func<TPoco, bool>>    predicate,
        Expression<Func<TPoco, TSortKey>> sortBy,
        bool descending,
        int skipRecords, int takeRecords) {
        if (!descending) {
            return Context.Set<TPoco>()
                 .Where<TPoco> predicate)
                .OrderBy(sortBy)
                .Skip(skipRecords)
                .Take(takeRecords);
        }
        return
            Context.Set<TPoco>()
                .Where<TPoco>(predicate)
                .OrderByDescending(sortBy)
                .Skip(skipRecords)
                .Take(takeRecords);
    }

【讨论】:

  • 源类型是 IQueryable。是的,我的方法顺序是正确的。我也有EF5。这很奇怪。
  • 这是一个问题。我刚刚写了一个测试来使降序工作。它做了。但我担心某处有问题。您在运行测试时没有偶然地使用 distinct 或 group 建立列表吗?我试图想象为什么它可能会失败。挣扎....
  • 我发现 2 个问题,一个是 EF dll 没有正确引用,我正在应用 Where 子句 2 次。现在从 Nuget 更新了 EF,并将 2 个 Where 子句从 2 个不同的地方(不同的子方法)合并到一个。
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2013-11-25
  • 2015-12-30
  • 2010-10-20
  • 2011-04-09
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多