C#代码中的SQL Lead和Lag函数

时间:2016-05-23 07:19:20

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

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

我对方法的偏好是:

  1. Linq to SQL
  2. 实体框架
  3. Dynamic Linq
  4. SQLFunctions类
  5. 通过SQLCommand手动TSQL
  6. 我知道可以通过方法5完成,但是1到4呢?

2 个答案:

答案 0 :(得分:2)

查看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来说是不可能的”:

答案 1 :(得分:1)

很棒的lib 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()
    };