2012-05-25 16 views
5

Jestem na moim pierwszym tygodniu letniego stażu programistycznego i zlecono mi przekonwertowanie instrukcji SQL Server 2008 na język C# przy użyciu LINQPad. Kiedy już to zrobię i sprawię, że działa poprawnie, mogę wprowadzić go do VS i dostosować w razie potrzeby.Konwersja instrukcji SQL CASE WHEN na C#

Problem polega na tym, że używam różnych instrukcji SQL. Nie mam pojęcia, jak konwertować. W mojej klasie C# nie konwertowaliśmy instrukcji SQL na C#, właśnie stworzyliśmy zmienną łańcuchową, przypisaliśmy instrukcję SQL do zmiennej, a następnie przypisaliśmy tę zmienną do obiektu OleDbCommand. Mój mentor wziął dzień wolny na długi weekend i jestem prawie sam i nie mam pojęcia, co robić i potrzebuję pomocy. Jest kilka takich tuzinów i jeśli mogę zobaczyć, jak to zrobić, to mogę wyliczyć resztę. Oto instrukcja SQL:

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

Jestem całkiem pewien, że to jest czy komunikat wzdłuż linii:

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] 

Próbowałem poniższy kod, który Pomyślałem nie zadziała ale musiałem gdzieś zacząć:

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; 
    } 

Byłbym wdzięczny, że ktoś może wskazać mi właściwy kierunek.

+3

+1 za faktycznie dping trochę pracy. Wygląda na to, że tak niewielu nowych programistów się tak zachowuje. –

+2

@ Michael Todd: Nie mogę się dowiedzieć, czy pozwalam wszystkim innym na robienie tego za mnie. Nie robienie niczego nie jest opcją, ponieważ chcę mieć pracę w tej firmie po ukończeniu studiów. Poza tym nie płacą mi za to. –

+0

Pierwszy tydzień jest zawsze najbardziej bolesny. ;) –

Odpowiedz

2

coś takiego:

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

@ AD.Net: Dziękuję za pomoc –

+0

Nie ma za co, to tylko sztuczka ze składnią –

Powiązane problemy