使用LINQ返回每个其他记录

时间:2009-10-07 20:13:55

标签: sql-server-2005 linq-to-sql row-number

我有一个查询返回10000个用作地图上绘图点的记录。为了减少负载并提高应用程序速度,我们尝试实现基本相当于Level of Detail逻辑的内容。基本上,当缩小时,显示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部分(example here),但是在执行此操作时,Where条件生成使用'between'而不是“where RowNumber%2 = 0“我需要。

我接近这个吗?为了获得我们在这里寻求的全部性能提升,这种排除确实需要在SQL服务器上进行。

2 个答案:

答案 0 :(得分:2)

你的桌子上有哪些栏目?例如,如果您有一个int identity主键列,则可以使用该...

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

...或...

where mt.SomeDataTime.Millisecond % 2 == 0

...说, 你想减少负荷吗?

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

答案 1 :(得分:0)

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

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

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

如果您希望尝试此操作,可以使用表格here制作扩展方法的“示例”。