2012-05-25 16 views
5

Estoy en mi primera semana de pasantía de programación de verano y he tenido la tarea de convertir las sentencias de SQL Server 2008 en C# utilizando LINQPad. Una vez que hago eso y lo hago funcionar correctamente, puedo ingresarlo en VS y ajustarlo según sea necesario.Conversión de la sentencia SQL CASE WHEN en C#

El problema es que estoy ejecutando sentencias de SQL que no tengo idea de cómo convertirlas. En mi clase C# no convertimos sentencias SQL en C#, simplemente creamos una variable de cadena, asignamos la declaración SQL a la variable y luego asignamos la variable a un objeto OleDbCommand. Mi mentor se tomó el día libre durante el largo fin de semana y estoy bastante solo y sin idea de qué hacer y necesito ayuda. Hay un par de docenas como esta y si puedo ver cómo hacer una, puedo descifrar el resto. Aquí está la instrucción SQL:

,[hrs].{Hours] - SUM(
    CASE 
    WHEN [UnitState].[UnitStateTye] <> 'ACTIVE' 
     THEN [Allocation].[AllocatedEnergyMwh] 
    ELSE 0 
    END 
/CAST([Unit].[NetDependableCapacity] AS FLOAT)) AS SH 

Estoy bastante seguro de que esto es una sentencia if lo largo de las líneas de:

if [UnitState].[UnitStateType] does not equal active 
then SH equals [hrs].[Hours] minus the the sum of 
    [Allocation].[AllocatedEnergyMwh]/(float)[Unit].[NetDependableCapacity]. 
else 
    SH = [hrs].[Hours] 

He probado el siguiente código, que me di cuenta de que no iba a funcionar pero necesitaba comenzar en alguna parte:

var results = 

    (from v in VDimUnit  
     join vf in VFactEnergyAllocation on v.UnitKey equals vf.UnitKey 
     join vd in VDimGadsEvent on vf.GadsEventKey equals vd.GadsEventKey 
     join vt in VDimTime on vf.TimeKey equals vt.TimeKey 
     join vus in VDimUnitState on vf.UnitKey equals vus.UnitKey 
    where vd.GadsEventEndTime.Year == 2011 && v.UnitId == "THL3" 
    group vf by new {vus.UnitStateType, vf.AllocatedEnergyMwh v.NetDependableCapacity, 
     vt.QuarterNum} into groupItem  
    select new {groupItem.Key.QuarterNum, SUM1 = groupItem.Sum(x=> (float)x.AllocatedEnergyMwh/
     groupItem.Key.NetDependableCapacity)}).ToArray(); 

var resultHours = 
    (from v in VDimTime 
    group v by v.QuarterNum into groupItem 
    select new {Hours = groupItem.Count(), groupItem.Key}).ToDictionary(x=> x.Key, x=> x.Hours); 

var finalResults = 
    (from r in results 
    select new {SH_IF_NOT_ACTIVE = resultHours[r.QuarterNum] - r.SUM1, 
     Hours = 
     SH_IF_ACTIVE = resultHours[r.QuarterNum]}); 

    if (SH != "ACTIVE") 
    { 
     SH_IF_NOT_ACTIVE; 
    } 
    else 
    { 
     SH_IF_ACTIVE; 
    } 

Agradecería que alguien me haya señalado la dirección correcta.

+3

+1 para dping realidad algo de trabajo. Muy pocos nuevos programadores aquí parecen hacer eso. –

+2

@ Michael Todd: No puedo saber si dejo que todos los demás lo hagan por mí. No hacer nada no es una opción porque quiero un trabajo con esta compañía cuando me gradúe. Además, no me pagan para desvincularme. –

+0

La primera semana es siempre la más dolorosa. ;) –

Respuesta

2

Algo como esto:

Hours = condition ? code when true : code when false; 
+0

@ AD.Net: Gracias por su ayuda –

+0

De nada, es solo un truco con la sintaxis –

Cuestiones relacionadas