Probleme beim Übreplace einer SQL-statement

Ich versuche, eine SQL-CASE-statement zu übreplace, aber ich laufe in einige Probleme und hoffte, dass ich eine Hand bekommen könnte. Hier ist die Aussage:

,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 

Dies ist, was ich komme, aber bekomme "verloren in Übersetzung":

Wenn [Gads].[GadsEventTypeCode] gleich 'D1', 'D2', 'D3', 'DP', 'PD', 'DM', 'D4'
dann ist Hrs_Derate gleich der Summe von:
[Allocation].[AllocatedEnergyMwh] / [Unit].[NetDependableCapacity]
sonst ist Hrs_Derate gleich Null.

Sie haben drei Elemente, die Sie übreplace müssen:

  1. CASE-statement – dies kann mit einem ternären Ausdruck behandelt werden , zB (cond) ? trueval : falseval (cond) ? trueval : falseval
  2. IN-Klausel – da ist der .Contains Operator, der überprüfen kann, ob ein Element in einem Array enthalten ist.
  3. Casting – der Cast-Operator, den ich glaube, wird über die gleichen methods in System.Convert .

Bewaffnet mit diesen drei Übersetzungsregeln brauchst du so etwas (ungetestet):

 var types = new [] { "D1", "D2", "D3", "DP", "PD", "DM", "D4" }; Hrs_Derate = ((types.Contains(gads.GadsEventTypeCode) ? allocation.AllocatedEnergyMwh : 0) / (Convert.ToFloat(unit.NetDependableCapacity))).Sum() 

Du bist nicht ganz da.

"Wenn" [Gads], "D"

Dies prüft, GadsEventTypeCode zu den aufgeführten Werten gehört.

"dann ist Hrs_Derate gleich der Summe von: [Allokation] [AllocatedEnergyMwh] / [Unit] [NetDependableCapacity]"

Das deckt den Rest ab. Das Bit über ELSE 0 bewirkt, dass es Zeilen ignoriert, die die GadsEventTypeCode Bedingung nicht erfüllen, dh das Hinzufügen von Null wirkt sich nicht auf die SUM . Ein NULL würde auch funktionieren.