2017-02-11 2 views
1

Ich schrieb einen T-SQL Code, der Fall verwendet hat, wenn in ausgewählten Bereich. Wir könnten t-sql oder store procedure nicht in der Anwendung verwenden, deswegen muss ich den folgenden Code in LINQ konvertieren.
Gibt es eine Möglichkeit, diesen Code schnell in linq zu ändern?Wie kann ich CASE WHEN mit LINQ implementieren?

SELECT 
    T.TaskID, 
    SUM(CASE WHEN T.LogDate<@fromDate AND T.TaskStatusID=2 THEN ISNULL(DA_CHILD.Score,0)*(T.DoneScore/100) ELSE 0 END) PreAmount, 
    SUM(CASE WHEN T.LogDate>[email protected] AND T.LogDate<[email protected] AND T.TaskStatusID=2 THEN ISNULL(DA_CHILD.Score,0)*(T.DoneScore/100) ELSE 0 END) CurAmount 

FROM 
    NetTasks$ T 
    INNER JOIN NetDeviceActions DA ON DA.DeviceActionID=T.DeviceActionID 
    LEFT JOIN NetFinancialInfoDetail FID ON FID.TaskID=T.TaskID 
    INNER JOIN NetActionParents AP ON AP.ParentID=DA.ActionID 
    INNER JOIN NetDeviceActions DA_CHILD ON DA_CHILD.ActionID=AP.ChildID AND 
              DA_CHILD.DeviceID=DA.DeviceID AND 
              DA_CHILD.ContractInfoID=DA.ContractInfoID 

WHERE 
     T.ParentTaskID = 0 AND 
     T.FinishDate<[email protected] AND 
     DA.ContractInfoID=9 

GROUP BY 
     T.TaskID, T.DoneScore,T.FinishDate 

Antwort

1

In LINQ können Sie C# -Anweisungen verwenden, so dass CASE WHEN eigentlich nicht schwer ist.

 var q = from a in values 
     group a by new {a.TaskID, a.DoneScore, a.FinishDate} into g 
     select new { 
      g.Key.TaskID, 
      PreAmount = g.Where(x => x.LogDate < fromDate && x.TaskStatusID == 2 && x.DA_CHILD.HasValue).Select(x => x.DoneScore).Sum(), 
      CurAmount = g.Where(x => x.LogDate >= fromDate && x.LogDate < toDate && x.TaskStatusID == 2 && x.DA_CHILD.HasValue).Select(x => x.DoneScore).Sum() 
      }; 

Und natürlich eine freundliche Erinnerung, links in LINQ Verbindung ist sehr mühsam: Angenommen, Sie alle die Verbindung in ein Query-Objekt namens Werte abgeschlossen haben, können Sie so etwas wie unten für die Gruppierung und wählen Sie verwenden können.

+0

Wie ich triple Zustand auf LINQ umsetzen können? –

0

Mit so gut aussehen SQL, würden Sie nicht glücklicher sein mit QueryFirst und Linq vergessen? Sie führen Ihre SQL direkt in Ihrer C# -App aus.

Haftungsausschluss: Ich schrieb QueryFirst