如何使用LINQ实现CASE WHEN?

时间:2017-02-11 07:07:30

标签: c# sql linq

我编写了一个LINQ代码,该代码在select范围内使用了case。我们无法在应用程序中使用t-sql或store过程,因为我需要将follong代码转换为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>=@fromDate AND T.LogDate<=@toDate 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<=@toDate AND DA.ContractInfoID=9 GROUP BY T.TaskID, T.DoneScore,T.FinishDate
有没有办法快速将此代码更改为linq?

{{1}}

3 个答案:

答案 0 :(得分:1)

在LINQ中你可以使用C#语句,所以CASE WHEN实际上并不难。 假设您已完成所有加入名为values的查询对象,您可以使用类似下面的内容进行分组并选择:

        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非常乏味。

答案 1 :(得分:0)

您是否只是在声明中寻找简单的where子句? (虽然我承认这个LINQ查询不会特别简单。)

https://msdn.microsoft.com/en-us/library/bb397927.aspx

我建议慢慢建立它。

答案 2 :(得分:0)

有了这样漂亮的SQL,你会不会更乐意使用QueryFirst并忘记Linq?您可以直接在C#app中运行SQL。

免责声明:我写过QueryFirst