我正在使用asp.net GridView控件,并将DatasourceId设置为EntityDataSource,如下所示页面加载将GridDataSource.EntityTypeFilter设置为视图名称,并添加where子句作为GridDataSource。where=sWhereClause
View有一百万条记录,但Where条件会筛选出该记录。EntityDataSource首先在Sub Query中获取所有一百万记录,然后应用Where which timing out命令。其生成如下所示的查询。我希望where子句应该与ViewName select语句本身一起使用,而不是与子查询表Extent1一起使用。
SELECT TOP (20)
[Filter1].[COL1],
[Filter1].[COL2]
[Filter1].[Col3]
FROM (
SELECT [Extent1].[COL1] , [Extent1].[COL2], [Extent1].[COL3]
, row_number() OVER (ORDER BY [Extent1].[COL1] ASC
) AS [row_number]
FROM
(
SELECT
ViewName.V1 ,
ViewName.V2
ViewName.V3
ViewName.V4
FROM [dbo].ViewName
)
AS [Extent1]
WHERE ([Extent1].[COL1] LIKE '%FilterValue%')
OR ([Extent1].[COL1] LIKE '%FilterValue%') OR ([Extent1].[COL2] LIKE '%FilterValue%') OR ([Extent1].[COL3] LIKE '%FilterValue%') )
) AS [Filter1]
WHERE [Filter1].[row_number] > 0
ORDER BY [Filter1].COL1] ASC
感谢并感谢您提前提供的帮助。
EntityDataSource首先在子查询中获取所有百万条记录,然后应用Where which timing out命令
仅仅因为WHERE
子句不在子查询中并不意味着子查询没有被筛选。SQL Server(假设您正在使用(可以将WHERE
子句谓词"下推"到子查询中,以及视图定义中的基表中。
但这在这里没有任何区别,因为必须为视图输出中的每一行评估多个LIKE
谓词,然后必须对所有行进行排序才能找到前20行。