我编写了一个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}}
答案 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