【问题标题】:EntityDataSet fetch all data and then applying where clause实体数据集获取所有数据,然后应用 where 子句
【发布时间】:2019-11-14 14:40:39
【问题描述】:

我正在使用 asp.net GridView 控件并将 DatasourceId 设置为 EntityDataSource,如下所示。 页面加载将 GridDataSource.EntityTypeFilter 设置为视图名称,并将 where 子句添加为 GridDataSource.Where = sWhereClause

视图有百万条记录,但 Where 条件过滤掉了记录。EntityDataSource 首先在子查询中获取所有百万条记录,然后应用 Where which timeout 命令。它生成如下查询。我希望 where 子句应该与 ViewName 选择语句本身一起使用,而不是与子查询表 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

提前感谢并感谢任何帮助。

【问题讨论】:

    标签: entity-framework gridview asp.net-dynamic-data entitydatasource


    【解决方案1】:

    EntityDataSource 首先获取子查询中的所有百万条记录,然后应用 Where which timeout 命令

    仅仅因为WHERE 子句不在子查询中并不意味着子查询没有被过滤。 SQL Server(假设这是您正在使用的),可以将WHERE 子句谓词“下推”到子查询中,以及视图定义中的基表中。

    但这不会有任何区别,因为您的多个 LIKE 谓词必须针对视图输出中的每一行进行评估,然后必须对所有行进行排序以找到前 20 个。

    【讨论】:

    • 感谢您的意见。我会尝试重构,看看它的表现如何。
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2017-01-02
    • 2011-06-06
    • 2019-03-03
    • 2020-10-17
    相关资源
    最近更新 更多