【问题标题】:Linq Query for TOP 11-20TOP 11-20 的 Linq 查询
【发布时间】:2013-07-10 08:02:30
【问题描述】:

执行此查询时出现错误:

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

var data = (from xx in VDC.SURVEY_EMAIL_BLAST
               where xx.USER_ID == userid
               orderby xx.ID
               select xx.TEMPLATE_ID).Distinct().Skip(10).Take(10));

实际上,我已经在那个查询中使用了OrderBy。但是,我得到了错误。

【问题讨论】:

  • 我猜你需要一个介于Distinct()Skip() 之间的OrderBy(...)
  • @DonatasK。就在问题中:The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.
  • 现有orderby无效的原因是Distinct破坏了排序。应该删除现有的orderby

标签: c# .net sql-server linq sql-order-by


【解决方案1】:

尝试在Skip 之前指定OrderBy,如下所示:

var data = (from xx in VDC.SURVEY_EMAIL_BLAST
            where xx.USER_ID == userid
            select xx.TEMPLATE_ID).Distinct()
                                  .OrderBy(x => x)
                                  .Skip(10).Take(10));

【讨论】:

  • 由于投影(select xx.TEMPLATE_ID),第一个查询返回一组整数。我猜你不能再通过.ID订购它。
【解决方案2】:

它准确地告诉你什么是错的以及如何解决它:

var data = (from xx in VDC.SURVEY_EMAIL_BLAST
                                where xx.USER_ID == userid
                                orderby xx.ID
                                select xx.TEMPLATE_ID)
           .Distinct()
           .OrderBy(x => x)
           .Skip(10)
           .Take(10));

【讨论】:

    【解决方案3】:

    试试这个

      data = (from xx in VDC.SURVEY_EMAIL_BLAST
                                where xx.USER_ID == userid
                                orderby xx.ID
                                select xx.TEMPLATE_ID).Distinct().Skip(10).Take(10);
    
      data1=data.ToList(); // it will fetch only 11-20.
    

    【讨论】:

    • -1 因为这在语义上非常不同。它会将所有项从数据库中提取到内存中。
    • 这将从数据库中拉回所有内容,然后在内存中而不是在数据库中执行LIMIT。这个查询可能会在一个非常大的表上爆炸。
    • 您的更新将引发与 OP 已经面临的完全相同的异常。
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多