2012-08-01 16 views
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

+0

正在改變數據庫的一個選項?它可能會破壞規範化,但是存儲這兩個值的表(僅限它們的當前版本)會大大簡化事情。 – 2012-08-01 21:15:46

+0

或者如果可能的話創建materiazed視圖。 – devundef 2012-08-01 21:28:39

回答

1

你能兩個查詢合併爲一個,與限制s.recordTime> = prevStartD & & s.recordTime < = currEndD並沒有採取(1)。這意味着只有一次訪問數據庫而不是兩次。將數據設置回來後,可以使用s.recordTime < = prevEndD條件在本地查詢這些結果以查找pDay值,然後使用s.recordTime> = currStartD條件再次查詢,並查看最後一條記錄以獲取cDay值。

+0

我確實將這兩個查詢移到了他們所在的foreach之外,並將結果存儲在一個列表中。然後在查詢中,我使用了一個包含Max()的查詢。現在表現非常好。 – Linger 2012-08-06 15:17:56

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」查詢。

相關問題