【问题标题】:Linq to SQL - Getting the last know history entry for each divice, prior to a certain dateLinq to SQL - 在某个日期之前获取每个设备的最后一个知道的历史记录条目
【发布时间】:2016-06-10 22:19:45
【问题描述】:

我有一个与此条目类似的问题:

how-do-i-query-sql-for-a-latest-record-date-for-each-user

...但我在 Linq 中需要它。

对于那些不想阅读其他链接的人来说,简而言之:

我有一个包含设备的历史记录表。在给定日期之前,我需要每个设备的最新条目。所以我不需要一个特定的值,而是整行。

示例数据:

ID | DeviceId | State   | LastUpdatedDate
0  | 1        | Online  | 2016-01-05 10:23:45
1  | 2        | Offline | 2016-01-04 00:05:33
2  | 1        | Offline | 2016-01-01 06:13:25
3  | 1        | Online  | 2016-01-07 11:02:06
4  | 3        | Offline | 2016-01-03 18:00:25
5  | 4        | Online  | 2016-01-08 03:00:05
4  | 3        | Offline | 2016-01-08 04:27:21

所以,如果我想知道 2016-01-05 之前的最后一个已知状态,我希望得到以下结果:

ID    | DeviceId | State   | LastUpdatedDate
1     | 2        | Offline | 2016-01-04 00:05:33
2     | 1        | Offline | 2016-01-01 06:13:25
4     | 3        | Offline | 2016-01-03 18:00:25

NULL  | 4        | NULL    | NULL

NULL 条目不是必需的,我只是为了清楚起见添加了它。同样,我在 Linq 中需要这个。我可以通过代码中的 foreach 轻松做到这一点,但我不想对数据库进行 700 次调用。我希望这相当有效。

谢谢!

【问题讨论】:

  • 到目前为止你尝试过什么?此外,我不能 100% 确定,但我认为 LINQ 会使用某种循环机制——它只会在代码中看起来更简洁。
  • 我确实让它在 SQL 中工作,可能效率不高,但工作。但我不知道如何将它翻译成 linq。我的sql如下:select * from DeviceHistory as dh right join (select (select top 1 Id from DeviceHistory where DeviceId = s.Id and LastUpdate <= '2016-06-11 00:00:00' order by LastUpdate desc) as HistoryId from Devices as s) as dhId on dh.Id = dhId.HistoryId where not Id is null order by LastUpdate desc

标签: c# sql sql-server linq


【解决方案1】:

这样的事情应该可以工作:

DateTime date = //... (e.g. 2016-01-05)

var result =
    entries //e.g., context.DeviceHistoryEntries
    .GroupBy(x => x.DeviceId)
    .Select(gr =>
        gr
        .Where(x => x.LastUpdatedDate < date)
        .OrderByDescending(x => x.LastUpdatedDate)
        .FirstOrDefault()) //This will give us null for devices that
                           //don't have a status entry before the date
    .AsEnumerable()
    .Where(x => x != null) //remove null values (optional)
    .ToList();

【讨论】:

  • 如果相同的 DeviceId 有 LastUpdatedDate 怎么办? , .FirstOrDefault() 不会带来那个,除非他那样做。
  • @AmitPore,我不确定我理解你的意思。你能详细说明一下吗?
  • 对不起,我的意思是相同的 deviceid 具有相同的 lastupdateddate
  • 在这种情况下,查询将返回其中之一
  • 在我的情况下,同一设备不可能有多个具有相同上次更新日期的条目
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2020-10-01
相关资源
最近更新 更多