2012-05-29 142 views
1

我正在嘗試翻譯一個SQL CASE語句,但遇到了一些問題,並希望能得到一隻手。以下是該語句:無法翻譯SQL語句

,SUM(CASE WHEN [Gads].[GadsEventTypeCode] IN ('D1', 'D2', 'D3', 'DP', 'PD', 'DM', 'D4') 
    THEN [Allocation].[AllocatedEnergyMwh] ELSE 0 END/
    CAST([Unit].[NetDependableCapacity] AS FLOAT)) AS Hrs_Derate 

這是我想出,但得到「迷失東京」:

如果[Gads].[GadsEventTypeCode]等於'D1', 'D2', 'D3', 'DP', 'PD', 'DM', 'D4'
然後Hrs_Derate等於總和:
[Allocation].[AllocatedEnergyMwh]/[Unit].[NetDependableCapacity]
其他Hrs_Derate等於零。

回答

1

您有您需要翻譯三個要素:

  1. CASE語句 - 這可以是handled with a ternary expression,例如,(cond) ? trueval : falseval
  2. IN子句 - 還有就是LINQ .Contains操作者可以檢查元素是否是包含在一個數組中。
  3. 鑄造 - 鑄造操作員我相信是通過在System.Convert相同的方法處理。

武裝與這三個轉換規則,你需要像這樣(未經):

var types = new [] { "D1", "D2", "D3", "DP", "PD", "DM", "D4" }; 

Hrs_Derate = 
    ((types.Contains(gads.GadsEventTypeCode) ? allocation.AllocatedEnergyMwh : 0) 
    /(Convert.ToFloat(unit.NetDependableCapacity))).Sum() 
+0

@ mellamokb - 感謝您的幫助,特別是關於.Contains運算符。我一定會利用它。但是,在我可以將SQL翻譯成LINQ之前,我必須明白聲明的意思。那正是我想要包裹我的頭。我在上面創建的if語句是否正確地翻譯了SQL語句的內容? –

+1

是的,你對代碼有一個粗略的認識。請注意,'GadsEventTypeCode'可能對每一行都不相同,所以它不會計算* Allocation.AllocatedEnergyMwh/Unit.NetDependeableCapacity或'0'的總和,但它通過行「循環」,並說,如果該行有一種類型的「D1,D2,...」,則將能量/容量添加到正在運行的總數中,否則將添加0.在表中的所有行中,一些將匹配類型代碼並貢獻一個值朝向總和,有些不匹配,因此對總和貢獻0。 – mellamokb

+0

@ mellamokb:啊,好的。這就說得通了。非常感謝你的澄清。你一直在幫助很大!我現在明白了。 –

1

你不太有。

「如果GADS] [GadsEventTypeCode] 等於 'D1', 'D2', 'D3', 'DP', 'PD', 'DM', 'D4'」

此檢查對於GadsEventTypeCode的任何列出的值。

「那麼Hrs_Derate等於的總和: [分配] [AllocatedEnergyMwh]/[單位] [NetDependableCapacity]。」

覆蓋其餘部分。關於ELSE 0的位使其忽略不符合GadsEventTypeCode條件的行,即,添加零不會影響SUM。 A NULL也可以。

+0

@ user92546:謝謝你的幫助。 –