我有一张表,大约每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
。
答案 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”查询。