SQL 来自 C# 代码的 Lead 和 Lag 函数
SQL Lead and Lag functions from C# code
是否可以使用 C# 中的 LEAD
或 LAG
SQL 函数?
我偏爱的方法是:
- 链接到 SQL
- Entity Framework
- 动态 Linq
- SQL函数class
- 手动 TSQL 通过 SQL 命令
我知道可以通过方法 5 完成,但是方法 1 到 4 呢?
查看 MoreLinq 项目(在 github 上):http://morelinq.github.io
在那里,Lead 和 Lag 被实现为扩展:
public static IEnumerable<TResult> Lag<TSource, TResult>(
this IEnumerable<TSource> source,
int offset,
TSource defaultLagValue,
Func<TSource, TSource, TResult> resultSelector
)
参考:https://morelinq.github.io/2.0/ref/api/html/M_MoreLinq_MoreEnumerable_Lag__2_1.htm
编辑:这只是 Linq to Objects。因此,当应用于 SQL 数据源时,它将获取所有行,然后在数据库外部进行计算。这不是 OP 所期望的。
研究结果说“没有,这是不可能的”对于第 1、2、3 和 4 项:
LEAD
和 LAG
出现在 SQL Server 2012 中,但是 SQL 服务器的最高版本是最新版本的 Linq SQL (Framework 4.6.1) 具有版本特定代码的目标是 2008:http://referencesource.microsoft.com/#System.Data.Linq/SqlClient/SqlProvider.cs,2fac3481a656764b
- Entity framework: 不,抱歉。
- MSDN 提示序列函数通常支持有限:https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/bb882656(v=vs.100)
- 没有提示
SqlFunctions
会提供领先、滞后或类似的东西:https://docs.microsoft.com/en-us/dotnet/api/system.data.objects.sqlclient.sqlfunctions?&view=netframework-4.8
很棒的库 linq2db
https://github.com/linq2db/linq2db supports Window-Functions LEAD
和 LAG
:
from p in db.Parent
join c in db.Child on p.ParentID equals c.ParentID
select new
{
Diff = Sql.Ext
.Lag(x.time, Sql.Nulls.None)
.Over()
.PartitionBy(p.time.Date)
.OrderBy(p.time)
.ToValue()
};
是否可以使用 C# 中的 LEAD
或 LAG
SQL 函数?
我偏爱的方法是:
- 链接到 SQL
- Entity Framework
- 动态 Linq
- SQL函数class
- 手动 TSQL 通过 SQL 命令
我知道可以通过方法 5 完成,但是方法 1 到 4 呢?
查看 MoreLinq 项目(在 github 上):http://morelinq.github.io
在那里,Lead 和 Lag 被实现为扩展:
public static IEnumerable<TResult> Lag<TSource, TResult>(
this IEnumerable<TSource> source,
int offset,
TSource defaultLagValue,
Func<TSource, TSource, TResult> resultSelector
)
参考:https://morelinq.github.io/2.0/ref/api/html/M_MoreLinq_MoreEnumerable_Lag__2_1.htm
编辑:这只是 Linq to Objects。因此,当应用于 SQL 数据源时,它将获取所有行,然后在数据库外部进行计算。这不是 OP 所期望的。
研究结果说“没有,这是不可能的”对于第 1、2、3 和 4 项:
LEAD
和LAG
出现在 SQL Server 2012 中,但是 SQL 服务器的最高版本是最新版本的 Linq SQL (Framework 4.6.1) 具有版本特定代码的目标是 2008:http://referencesource.microsoft.com/#System.Data.Linq/SqlClient/SqlProvider.cs,2fac3481a656764b- Entity framework: 不,抱歉。
- MSDN 提示序列函数通常支持有限:https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/bb882656(v=vs.100)
- 没有提示
SqlFunctions
会提供领先、滞后或类似的东西:https://docs.microsoft.com/en-us/dotnet/api/system.data.objects.sqlclient.sqlfunctions?&view=netframework-4.8
很棒的库 linq2db
https://github.com/linq2db/linq2db supports Window-Functions LEAD
和 LAG
:
from p in db.Parent
join c in db.Child on p.ParentID equals c.ParentID
select new
{
Diff = Sql.Ext
.Lag(x.time, Sql.Nulls.None)
.Over()
.PartitionBy(p.time.Date)
.OrderBy(p.time)
.ToValue()
};