2012-05-29 104 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:谢谢你的帮助。 –