2017-02-11 39 views
1

我寫了一個T-SQL代碼,它在選擇範圍內使用過大小寫。我們不能在應用程序中使用t-sql或存儲過程,因爲我需要將follong代碼轉換爲LINQ
有沒有什麼辦法可以很快的將這段代碼改成linq?如何在LINQ中實現CASE?

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 

回答

1

在LINQ中,您可以使用C#語句,因此CASE WHEN實際上並不難。 假設你已經完成了所有加入到一個查詢對象叫值,可以使用類似下面的分組和選擇:

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

當然,一個友好的提醒,留在LINQ加盟是非常乏味的。

+0

如何在LINQ上實現三重條件? –

0

有了這樣好看的SQL,你會不會開心使用QueryFirst忘記了Linq?您可以直接在C#應用程序中運行SQL。

免責聲明:我寫了QueryFirst