0

我有一张表格,大约每 15 分钟记录一次来自逆变器的信息。逆变器发送的数据之一是kwhtotal表示通过该逆变器产生了多少总功率的数字。我正在尝试正确查询以获取特定日期的发电量。为此,我需要检索前一天的最后读数并将其与当天的最后读数进行比较。

这是我到目前为止所拥有的:

DateTime prevStartD = new DateTime((utcStartingDate.AddDays(i - 1)).Year, (utcStartingDate.AddDays(i - 1)).Month, (utcStartingDate.AddDays(i - 1)).Day, 0, 0, 0);
DateTime prevEndD = new DateTime((utcStartingDate.AddDays(i - 1)).Year, (utcStartingDate.AddDays(i - 1)).Month, (utcStartingDate.AddDays(i - 1)).Day, 23, 59, 59);

var previousDay = (from s in db.PowerInverterHistorys
                   join u in db.PowerInverters on s.inverter_id equals u.id
                   where u.name == record && (s.recordTime >= prevStartD && s.recordTime <= prevEndD)
                   orderby s.recordTime descending
                   select new
                   {
                       s.recordTime,
                       s.kwhtotal
                   }).Take(1);

DateTime currStartD = new DateTime((utcStartingDate.AddDays(i)).Year, (utcStartingDate.AddDays(i)).Month, (utcStartingDate.AddDays(i)).Day, 0, 0, 0);
DateTime currEndD = new DateTime((utcStartingDate.AddDays(i)).Year, (utcStartingDate.AddDays(i)).Month, (utcStartingDate.AddDays(i)).Day, 23, 59, 59);

var currentDay = (from s in db.PowerInverterHistorys
                  join u in db.PowerInverters on s.inverter_id equals u.id
                  where u.name == record && (s.recordTime >= currStartD && s.recordTime <= currEndD)
                  orderby s.recordTime descending
                  select new
                  {
                      s.recordTime,
                      s.kwhtotal
                  }).Take(1);

double? pDay = 0, cDay = 0;
foreach (var p in previousDay) { pDay = p.kwhtotal; }
foreach (var c in currentDay) { cDay = c.kwhtotal; }

var generatedPower = cDay - pDay;

它可以工作并运行,但是效率低下。页面在运行时打开需要很长时间。 我能做些什么来加快这个查询吗?我需要做的就是从kwhtotal当天的最后一个条目中减去前一天kwhtotal的最后一个条目。

4

2 回答 2

1

您能否将这两个查询合二为一,限制 s.recordTime >= prevStartD && s.recordTime <= currEndD 并且没有 Take(1)。这意味着只有一次访问数据库而不是两次。恢复数据集后,您可以使用 s.recordTime <= prevEndD 条件在本地查询这些结果以找到您的 pDay 值,然后使用 s.recordTime >= currStartD 条件再次查询并查看最后一条记录以获取 cDay价值。

于 2012-08-01T21:33:15.347 回答
0
var previousDay = (from s in db.PowerInverterHistorys
                   join u in db.PowerInverters on s.inverter_id equals u.id
                   where u.name == record && (s.recordTime >= prevStartD && s.recordTime <= prevEndD)
                   orderby s.recordTime descending
                   select new
                   {
                       s.recordTime,
                       s.kwhtotal
                   }).Take(1);

如果您有大型数据集,OrderBy 对数据库来说是昂贵的操作。使用 Max() 或 Min() 代替,这将始终为您提供相应的第一行。这也应该适用于您的“CurrentDay”查询。

于 2012-08-02T12:24:07.203 回答