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
.
可能吗?
你可以试试这个:
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以提高可读性