2014-10-27 17 views
0

我有許多(18)值定期讀取的實體。這些值可能會或可能不會設置警報,因此具有「狀態」。太多的LET子句導致查詢緩慢,但無法使用擴展方法

我需要在實體查詢的linq期間進行一些計算。我需要比較18個不同值的報警狀態,並獲得該地段最差的狀態。我不能保存讀數狀態,並在實體報警更改時重新計算。我有問題以有效的方式實現這一點。

這不起作用:我不能使用擴展方法... GetOverallStatus(..) cannot be translated into a store expression...

from reading in db.Readings 
let OverallStatus = reading.GetOverallStatus() 
select new StatusModel() { Reading = reading, Status = (StatusValue)overallStatus }).ToList(); 

這並不工作,但(可以理解)需要一個年齡編譯調用時:

from reading in db.Readings 
let entity = reading.entity 
let Value1Status = !runSpeedOK || reading.Value1 == null ? (noReadings : (!(entity.Alarm1AlarmsOn ?? false) ? (notConfig : (reading.Value1 >= entity.Alarm1Critical ? (critical : (reading.Value1 >= entity.Alarm1Warning ? (warning : (ok))) 
let Value2Status = !runSpeedOK || reading.Value2 == null ? (noReadings : (!(entity.Alarm2AlarmsOn ?? false) ? (notConfig : (reading.Value2 >= entity.Alarm2Critical ? (critical : (reading.Value2 >= entity.Alarm2Warning ? (warning : (ok))) 
let Value3Status = !runSpeedOK || reading.Value3 == null ? (noReadings : (!(entity.Alarm3AlarmsOn ?? false) ? (notConfig : (reading.Value3 >= entity.Alarm3Critical ? (critical : (reading.Value3 >= entity.Alarm3Warning ? (warning : (ok))) 
let Value4Status = !runSpeedOK || reading.Value4 == null ? (noReadings : (!(entity.Alarm4AlarmsOn ?? false) ? (notConfig : (reading.Value4 >= entity.Alarm4Critical ? (critical : (reading.Value4 >= entity.Alarm4Warning ? (warning : (ok))) 
let Value5Status = !runSpeedOK || reading.Value5 == null ? (noReadings : (!(entity.Alarm5AlarmsOn ?? false) ? (notConfig : (reading.Value5 >= entity.Alarm5Critical ? (critical : (reading.Value5 >= entity.Alarm5Warning ? (warning : (ok))) 
let Value6Status = !runSpeedOK || reading.Value6 == null ? (noReadings : (!(entity.Alarm6AlarmsOn ?? false) ? (notConfig : (reading.Value6 >= entity.Alarm6Critical ? (critical : (reading.Value6 >= entity.Alarm6Warning ? (warning : (ok))) 
let Value7Status = !runSpeedOK || reading.Value7 == null ? (noReadings : (!(entity.Alarm7AlarmsOn ?? false) ? (notConfig : (reading.Value7 >= entity.Alarm7Critical ? (critical : (reading.Value7 >= entity.Alarm7Warning ? (warning : (ok))) 
let Value8Status = !runSpeedOK || reading.Value8 == null ? (noReadings : (!(entity.Alarm8AlarmsOn ?? false) ? (notConfig : (reading.Value8 >= entity.Alarm8Critical ? (critical : (reading.Value8 >= entity.Alarm8Warning ? (warning : (ok))) 
let Value9Status = !runSpeedOK || reading.Value9 == null ? (noReadings : (!(entity.Alarm9AlarmsOn ?? false) ? (notConfig : (reading.Value9 >= entity.Alarm9Critical ? (critical : (reading.Value9 >= entity.Alarm9Warning ? (warning : (ok))) 
let Value10Status = !runSpeedOK || reading.Value10 == null ? (noReadings : (!(entity.Alarm10AlarmsOn ?? false) ? (notConfig : (reading.Value10 >= entity.Alarm10Critical ? (critical : (reading.Value10 >= entity.Alarm10Warning ? (warning : (ok))) 
let Value11Status = !runSpeedOK || reading.Value11 == null ? (noReadings : (!(entity.Alarm11AlarmsOn ?? false) ? (notConfig : (reading.Value11 >= entity.Alarm11Critical ? (critical : (reading.Value11 >= entity.Alarm11Warning ? (warning : (ok))) 
let Value12Status = !runSpeedOK || reading.Value12 == null ? (noReadings : (!(entity.Alarm12AlarmsOn ?? false) ? (notConfig : (reading.Value12 >= entity.Alarm12Critical ? (critical : (reading.Value12 >= entity.Alarm12Warning ? (warning : (ok))) 
let Value13Status = !runSpeedOK || reading.Value13 == null ? (noReadings : (!(entity.Alarm13AlarmsOn ?? false) ? (notConfig : (reading.Value13 >= entity.Alarm13Critical ? (critical : (reading.Value13 >= entity.Alarm13Warning ? (warning : (ok))) 
let Value14Status = !runSpeedOK || reading.Value14 == null ? (noReadings : (!(entity.Alarm14AlarmsOn ?? false) ? (notConfig : (reading.Value14 >= entity.Alarm14Critical ? (critical : (reading.Value14 >= entity.Alarm14Warning ? (warning : (ok))) 
let Value15Status = !runSpeedOK || reading.Value15 == null ? (noReadings : (!(entity.Alarm15AlarmsOn ?? false) ? (notConfig : (reading.Value15 >= entity.Alarm15Critical ? (critical : (reading.Value15 >= entity.Alarm15Warning ? (warning : (ok))) 
let Value16Status = !runSpeedOK || reading.Value16 == null ? (noReadings : (!(entity.Alarm16AlarmsOn ?? false) ? (notConfig : (reading.Value16 >= entity.Alarm16Critical ? (critical : (reading.Value16 >= entity.Alarm16Warning ? (warning : (ok))) 
let Value17Status = !runSpeedOK || reading.Value17 == null ? (noReadings : (!(entity.Alarm17AlarmsOn ?? false) ? (notConfig : (reading.Value17 >= entity.Alarm17Critical ? (critical : (reading.Value17 >= entity.Alarm17Warning ? (warning : (ok))) 
let Value18Status = !runSpeedOK || reading.Value18 == null ? (noReadings : (!(entity.Alarm18AlarmsOn ?? false) ? (notConfig : (reading.Value18 >= entity.Alarm18Critical ? (critical : (reading.Value18 >= entity.Alarm18Warning ? (warning : (ok))) 
let OverallStatus = (new int[18] { Value1Status, Value2Status, Value3Status, Value4Status, Value5Status, Value6Status, Value7Status, Value8Status, Value9Status, Value10Status, Value11Status, Value12Status, Value13Status, Value14Status, Value15Status, Value16Status, Value17Status, Value18Status }).Max() 
select new StatusModel() { Reading = reading, Status = (StatusValue)overallStatus }).ToList(); 

這是,當然,另一種選擇既是最好的,也是最乾淨的,我不知道爲什麼我沒有早點想到它。明顯地受挫:

foreach (var reading in db.Readings.ToList()) 
{ 
    result.Add(new ReportVibReadingStatusModel() { Reading = reading, Status = reading.GetOverallStatusValue() }); 
} 
+4

編碼恐怖... – Areks 2014-10-27 14:44:49

+0

是的。我同意。如何讓它變得更好? – 2014-10-27 14:58:56

+0

我假設'StatusValue'是一個枚舉。你目前是否將它們映射爲int值(或者按照學位順序)? – IronMan84 2014-10-27 15:00:22

回答

0

我必須承認我不太熟悉實體框架,但我知道它支持存儲過程。我會編寫一個存儲過程來返回純粹在SQL端可以確定的值。意思是所有這些ValueStatuses。

我可能就已經把這個作爲評論的問題,但我還不能:)

+0

我已經考慮過StoredProcedures,但不幸的是,它也出現在'不要觸摸也不能改變數據庫,但修復它'類別 – 2014-10-27 15:55:02

+0

我感到你的痛苦抱歉,我無法幫助,但我'我很高興你註冊一些適合你的東西! – Taekahn 2014-10-27 16:02:33