加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从IQueryable中删除OrderBy

发布时间:2020-12-15 04:31:13 所属栏目:百科 来源:网络整理
导读:我有一个分页API返回一个用户请求的行,但一次只有这么多,而不是整个集合. API按照设计工作,但我必须计算可用记录的总数(适用于页面计算).在API中,我使用 Linq2Sql,我在IQueryable之前做了很多工作,然后才能终止我的请求.当我去获得计数,我调用如下:totalRec
我有一个分页API返回一个用户请求的行,但一次只有这么多,而不是整个集合. API按照设计工作,但我必须计算可用记录的总数(适用于页面计算).在API中,我使用 Linq2Sql,我在IQueryable之前做了很多工作,然后才能终止我的请求.当我去获得计数,我调用如下:totalRecordCount = queryable.Count();

生成的SQL是有趣的,但它也增加了一个不必要的Order By,使得查询非常昂贵.

exec sp_executesql N'SELECT COUNT(*) AS [value]
FROM (
    SELECT TOP (1) NULL AS [EMPTY]
    FROM [dbo].[JournalEventsView] AS [t0]
    WHERE [t0].[DataOwnerID] = @p0
    ORDER BY [t0].[DataTimeStamp] DESC
    ) AS [t1]',N'@p0 int',@p0=1

因为我正在使用IQueryable,所以我可以在IQueryable之前操作它到SQL Server.

我的问题是,如果我已经有一个有OrderBy的IQueryable,可以在调用Count()之前删除该OrderBy吗?

像:totalRecordCount = queryable.NoOrder.Count();

如果没有,没有biggie.我看到很多问题如何OrderBy,但不是任何涉及从Linq表达式中删除OrderBy.

谢谢!

解决方法

不仅仅是一个不需要的ORDER BY,还有一个虚假的TOP(1).
SELECT TOP (1) NULL AS [EMPTY] ...

该子选择只返回0或1行.实际上没有TOP,在子选中有一个ORDER BY是不合法的.

The ORDER BY clause is invalid in views,inline functions,derived tables,subqueries,and common table expressions,unless TOP or FOR XML is also specified.: SELECT COUNT(*) FROM ( SELECT * FROM Table1 ORDER BY foo )

sqlfiddle

我想你可能在你的LINQ做错了.你确定你没有写过.在调用.Count()之前,在查询中的某个地方找到(1)或类似的东西?

这是错的:

IQueryable<Foo> foo = (...).OrderBy(x => x.Foo).Take(1);
int count = foo.Count();

你应该这样做:

IQueryable<Foo> foo = (...);
Iqueryable<Foo> topOne = foo.OrderBy(x => x.Foo).Take(1);
int count = foo.Count();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读