SQL 来自 C# 代码的 Lead 和 Lag 函数

SQL Lead and Lag functions from C# code

是否可以使用 C# 中的 LEADLAG SQL 函数?

我偏爱的方法是:

  1. 链接到 SQL
  2. Entity Framework
  3. 动态 Linq
  4. SQL函数class
  5. 手动 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 项:

很棒的库 linq2db https://github.com/linq2db/linq2db supports Window-Functions LEADLAG:

    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()
    };