2

我有一个查询,它返回 10000 条用作地图上的绘图点的记录。为了减少负载并提高应用程序速度,我们正在尝试实现基本上相当于细节级别的逻辑。基本上,缩小时,显示 50% 的点。放大时,显示 100% 的点。

这最终是我需要最终 SQL 的样子:

SELECT *
FROM 
    (SELECT 
        [t0].[RecordName], 
        [t0].[LastMaintenanceDate]
        ,Row_Number() OVER (ORDER BY [t0].Ticker) as RowNumber 
        FROM 
            [dbo].[TableName] AS [t0]
    )as [t1]
WHERE RowNumber % 2 = 0

在 LINQ 中,我可以使用 .Skip 和 .Take 来获取 Row_Number() Over 部分(例如此处),但是在执行此操作时,生成的 Where 条件使用“between”而不是“where RowNumber % 2 = 0”,我需要.

我正确地接近这个吗?为了获得我们在这里寻找的全部性能提升,这个排除确实需要在 SQL 服务器上发生。

4

2 回答 2

2

你的表中有哪些列?例如,如果您有一个 int identity 主键列,您可以使用它...

from mt in dc.MyTable
where mt.ID %2 == 0
select mt

...或者...

where mt.SomeDataTime.Millisecond % 2 == 0

...也就是说,您在哪里尝试减少负载?

您帖子中的 T-SQL 以及我提到的两个解决方案都将强制进行全表扫描,因此如果您的表很大,那么您最好根据索引的内容减少记录(以及在哪里子句谓词实际上可以使用索引)...

于 2009-10-08T01:15:50.107 回答
0

morelinq项目有一个执行此操作的TakeEvery函数,但这仅适用于 IEnumerable。

应该可以创建一个扩展方法来解决这个问题(我目前没有可用的开发环境,所以我现在无法测试它)。

在您的具体示例中,我猜测 Table 的扩展方法就足够了。

如果您想尝试这个,这里有一个对表进行扩展方法的“示例

于 2009-10-07T22:00:30.247 回答