Linq-to-SQL:对连续元素的算术运算

本文关键字:算术运算 元素 连续 Linq-to-SQL | 更新日期: 2023-09-27 18:37:06

例如,我有一个表:

Date      |Value
----------|-----
2015/10/01|5
2015/09/01|8
2015/08/01|10

有没有办法使用 Linq-to-SQL 来获取一个新序列,该序列将是先前排序集合(例如,i.Value - (i-1).Value)中连续元素之间的算术运算?它必须在 SQL Server 2008 端执行,而不是在应用程序端执行。

例如dataContext.GetTable<X>().OrderByDescending(d => d.Date).Something(.......).ToArray();应返回3, 2 .

可能吗?

Linq-to-SQL:对连续元素的算术运算

你可以试试这个:

var q = (
         from i in Items
         orderby i.ItemDate descending
         let prev = Items.Where(x => x.ItemDate < i.ItemDate).FirstOrDefault()
         select new { Value = i.ItemValue - (prev == null ? 0 : prev.ItemValue) }
        ).ToArray();

编辑:

如果将上述 linq 查询稍微修改为:

var q = (from i in Items
         orderby i.ItemDate descending
         let prev = Items.Where(x => x.ItemDate < i.ItemDate).FirstOrDefault()
         select new { Value = (int?)i.ItemValue - prev.ItemValue }
        ).ToArray();

然后,您将获得发送到数据库的以下 TSQL 查询:

SELECT ([t0].[ItemValue]) - ((SELECT [t2].[ItemValue]
                              FROM (SELECT TOP (1) [t1].[ItemValue]
                                    FROM [Items] AS [t1]
                                    WHERE [t1].[ItemDate] < [t0].[ItemDate]) AS [t2]
                              )) AS [Value]
FROM [Items] AS [t0]
ORDER BY [t0].[ItemDate] DESC

我现在的猜测是,如果您在ItemDate字段上放置索引,则表现不会太差。

我不会让SQL这样做,它会创建一个低效的SQL查询(我认为)。

我可以创建一个存储过程,但如果数据量不是太大,我也可以使用 Linq 来对象:

List<x> items=dataContext.GetTable<X>().OrderByDescending(d => d.Date).ToList();//Bring data to memory
var res = items.Skip(1).Zip(items, (cur, prev) => cur.Value - prev.Value);

最后,我可能会使用foreach以提高可读性