2012-05-29 5 views
1

Я пытаюсь перевести инструкцию SQL CASE, но я столкнулся с некоторыми проблемами и надеялся, что я могу получить руку. Вот заявление:Trouble перевод 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. В статье - есть 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 равна сумме:. [Allocation] [AllocatedEnergyMwh]/[Unit] [NetDependableCapacity]."

Это охватывает все остальное. Бит около ELSE 0 заставляет его игнорировать строки, которые не соответствуют условию GadsEventTypeCode, то есть добавление нуля не влияет на SUM. A NULL будет работать.

+0

@ user92546: Благодарим за помощь. –