【问题标题】:Join by LINQ to Entities (EF) same Table based on Time通过 LINQ to Entities (EF) 加入基于时间的同一个表
【发布时间】:2019-01-29 13:12:24
【问题描述】:

我的表格包含有关time 和一些data 的信息。预期结果是在两行之间显示interval(以秒为单位),并显示data

MyTable(来源):

------------------------------
|        Time        |  Data |
------------------------------
| 23.8.2018 14:00:00 |  abc  |
| 23.8.2018 14:00:02 |  def  |
| 23.8.2018 14:00:05 |  ghi  |
| 23.8.2018 14:00:06 |  jkl  |
------------------------------

预期结果:

-------------------
| interval| result|
-------------------
|    2    |  abc  |
|    3    |  def  |
|    1    |  ghi  |
|   NULL  |  jkl  | --optional result / might not exist
-------------------

我想到的可能解决方案:

我的结论是可以通过JOINZIP 在 LINQ/SQL 中获得结果。如发现的那样,ZIP 不受 Linq to Entities 的支持,但应该在局部变量中工作。

类似:

var lTmp = lData.Zip(lData.Skip(1), (a, b) => new
           {
               interval = (b.Time - a.Time).Seconds,
               result = a.Value
           }).ToList();

想到JOIN,我来到了“解决方案”,我可以在下一行加入同一个表,但我不知道应该如何用 LINQ 编写它。考虑到 ID,我可以加入比前一个大 (+1) 的 ID,但可能会丢失某些行,这些行必须按 Time(不是 ID)排序。

最后但并非最不重要的一点是,直接在 SQL 中我可以编写如下内容:

SELECT
    DATEDIFF(MILLISECOND,
             [Time],
             LEAD([Time], 1, null) OVER (ORDER BY [Time])) AS interval,
    result
FROM
    Data

问题:

是否可以在 LINQ(Linq to Entities)中编写这样的查询以及如何编写?还是我需要把它放在存储过程/普通 SQL 查询中?

【问题讨论】:

    标签: c# sql-server entity-framework linq linq-to-sql


    【解决方案1】:

    LINQ(所有形式)仅支持等值连接,因此 join 已退出。

    但你可以自己做一个子查询,按时间获取下一行:

    from left in table
    let right = (from x in table
                 where x.Time > left.Time
                 orderby x.Time
                 select x).FirstOrDefault)
    where right != null
    select new {
        left.Data,
        interval = right.Time - left.Time
    }
    

    (您可能需要使用其中一个 SQL 函数来执行时间差。)

    通常数据库可以优化这样一个相关的子查询,因此性能可能不会太差。否则,您可能需要发送自己的 SQL。

    【讨论】:

    • FirstOrDefault 会为最后一行抛出错误,应该处理。
    • @iSpain17 是的...当left 是最后一行时,所要求的查询没有意义,因此将其过滤掉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多