生成的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.
谢谢!
解决方法
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 )
我想你可能在你的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();
原文地址:https://www.jb51.cc/csharp/91312.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。