1

我正在尝试翻译 SQL CASE 语句,但遇到了一些问题,希望能帮上忙。这是声明:

,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等于零。

4

2 回答 2

1

您需要翻译三个元素:

  1. CASE 语句 - 这可以用三元表达式来处理,例如, (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()
于 2012-05-29T13:52:41.533 回答
1

你不完全在那里。

“如果 [Gads].[GadsEventTypeCode]等于'D1'、'D2'、'D3'、'DP'、'PD'、'DM'、'D4'”

这将检查是否GadsEventTypeCode任何列出的值。

“那么 Hrs_Derate 等于:[Allocation].[AllocatedEnergyMwh] / [Unit].[NetDependableCapacity] 之和”

这涵盖了其余部分。about 位ELSE 0会导致它忽略不满足GadsEventTypeCode条件的行,即添加零不会影响SUM. ANULL也可以。

于 2012-05-29T14:20:54.880 回答