获取两个不同日期的数据库中的最后一个条目并计算差异

时间:2012-08-01 21:04:16

标签: c# linq

我有一张表,大约每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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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对于DB来说是昂贵的操作。使用Max()或Min()代替将始终给出相应的第一行。 这也应该适用于您的“CurrentDay”查询。