【发布时间】:2016-06-04 06:12:05
【问题描述】:
在使用 Skip(0) 时,有没有办法强制 LINQ to SQL 避免使用 TOP X?我有一个对每个分页结果都运行良好的查询...除了第 1 页。我已经分析了查询,并且引入了 TOP 子句只会杀死它。我很困惑为什么会这样,但确实如此。但是,使用介于 1 和 10 之间的 RowNumber 效果很好。
在使用 Skip(0) 时,有没有办法强制 LINQ to SQL 避免使用 TOP X?我有一个对每个分页结果都运行良好的查询...除了第 1 页。我已经分析了查询,并且引入了 TOP 子句只会杀死它。我很困惑为什么会这样,但确实如此。但是,使用介于 1 和 10 之间的 RowNumber 效果很好。
罪魁祸首似乎是我的 WHERE 子句中的 EXISTS 条件。生成的 SQL 如下。在 SQL 管理器中,此查询运行良好并返回 14 个结果......但是一旦我添加了 TOP 10(就像 LINQ 一样),它就会超时。但是,如果我在 where 子句中注释 EXISTS,那么问题就会消失。
SELECT
t0.ProtectiveOrderID,
t3.DocketID,
t3.DocketNumber AS CaseNumber,
t3.PartySuffix AS CaseNumberSuffix,
t5.FirstName AS RespondentNameFirst,
t5.MiddleName AS RespondentNameMiddle,
t5.LastName AS RespondentNameLast,
t5.NameSuffix AS RespondentNameSuffix,
t4.FirstName AS ProtectedNameFirst,
t4.MiddleName AS ProtectedNameMiddle,
t4.LastName AS ProtectedNameLast,
t4.NameSuffix AS ProtectedNameSuffix,
t3.ChildNextFriendFirstName AS ChildNextFriendNameFirst,
t3.ChildNextFriendMiddleName AS ChildNextFriendNameMiddle,
t3.ChildNextFriendLastName AS ChildNextFriendNameLast,
t3.ChildNextFriendNameSuffix
FROM dbo.ProtectiveOrder AS t0
INNER JOIN (
SELECT MAX(t1.ProtectiveOrderID) AS value
FROM dbo.ProtectiveOrder AS t1
GROUP BY t1.DocketID
) AS t2 ON t0.ProtectiveOrderID = t2.value
LEFT OUTER JOIN dbo.Docket AS t3 ON t3.DocketID = t0.DocketID
LEFT OUTER JOIN dbo.Directory AS t4 ON t4.DirectoryID = t3.ProtectedPartyID
LEFT OUTER JOIN dbo.Directory AS t5 ON t5.DirectoryID = t3.SubjectID
WHERE
(
((t4.LastName LIKE 'smith%') AND (t4.FirstName LIKE 'jane%'))
OR ((t5.LastName LIKE 'smith%') AND (t5.FirstName LIKE 'jane%'))
OR ((t3.ChildNextFriendLastName LIKE 'smith%') AND (t3.ChildNextFriendFirstName LIKE 'jane%'))
OR (
-- ***************
-- THIS GUY KILLS THE QUERY WHEN A TOP IS INTRODUCED IN THE TOP-LEVEL SELECT
-- ***************
EXISTS(
SELECT NULL AS EMPTY
FROM dbo.Child AS t6
WHERE (t6.LastName LIKE 'smith%') AND (t6.FirstName LIKE 'jane%') AND (t6.DocketID = t3.DocketID)
)
)
)
ORDER BY t3.DocketNumber
【问题讨论】:
-
可能也想发布 LINQ 查询。我刚刚尝试了一些使用 Joins、Skips 和 Takes 的示例查询,每个查询都导致使用 ROW_NUMBER()。
标签: sql linq-to-sql