无法翻译SQL语句

时间:2012-05-29 13:41:22

标签: sql-server linq-to-sql

我正在尝试翻译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]
 else Hrs_Derate等于零。

2 个答案:

答案 0 :(得分:1)

您需要翻译三个元素:

  1. CASE语句 - 可以是handled with a ternary expression,例如(cond) ? trueval : falseval
  2. IN子句 - 有LINQ .Contains运算符,可以检查数组中是否包含元素。
  3. 投射 - 我相信的投射操作符是通过System.Convert中的相同方法处理的。
  4. 有了这三个翻译规则,你需要这样的东西(未经测试):

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

答案 1 :(得分:1)

你不在那里。

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

这会检查GadsEventTypeCode 列出的所有值。

“然后Hrs_Derate等于:  [分配]。[AllocatedEnergyMwh] / [Unit]。[NetDependableCapacity]“

这涵盖了其余部分。关于ELSE 0的位使其忽略不符合GadsEventTypeCode条件的行,即添加零不会影响SUMNULL也可以使用。