【问题标题】:SQL Lead and Lag functions from C# codeC# 代码中的 SQL Lead 和 Lag 函数
【发布时间】:2016-09-19 23:16:25
【问题描述】:

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

我偏爱的方法是:

  1. Linq to SQL
  2. 实体框架
  3. 动态 Linq
  4. SQLFunctions 类
  5. 通过 SQLCommand 手动 TSQL

我知道可以通过方法 5 来完成,但是 1 到 4 呢?

【问题讨论】:

  • stackoverflow.com/a/21767411/1132334 将暗示 1 和 3 是不可能的(还)。但是这个答案已经有两年多了,所以对最新的 .NET 框架的研究似乎值得付出努力

标签: c# sql sql-server-2012 sql-function


【解决方案1】:

查看 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 项,研究结果显示“,这是不可能的”:

【讨论】:

  • 我确实看过,但它似乎只是用于对象的 linq。我刚刚下载了最新的测试版来证明,是的,在执行内存中的滞后/领先之前从 SQL 中提取整个表。
【解决方案2】:

很棒的库 linq2db https://github.com/linq2db/linq2db 支持 Window-FunctionsLEADLAG

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2021-05-23
    相关资源
    最近更新 更多