LINQ查询无法获取数据,需将指定SQL转换为带变量的LINQ
问题:SQL查询正常但LINQ无法获取相同结果
我最近碰到个头疼的问题:用SQL语句能正确算出结果,但换成LINQ就拿不到数据了。先给你看我的SQL查询,它返回的结果是1:
select sum(datediff(Day,'2018-04-30','2018-04-30')) as dd from lms03192018.dbo.LeaveRequestModels where leaveTypeId = '1' and requestUserId = '5dc64ba7-8cf8-45dd-80f2-a8700e7dad2e' and FromDate = '2018-04-30'
(注:原SQL里的2018-04-31是无效日期,4月只有30天,我这里改成了有效的2018-04-30,应该是笔误)
我想用LINQ实现完全一样的逻辑,而且要把SQL里硬编码的日期换成变量和视图模型里的日期值。之前我写的代码开头是var m...,但没成功,希望能得到正确的LINQ写法。
解决方案
首先,先定义好需要的变量(可以直接替换成你的视图模型属性):
// 替换成视图模型中的日期或自定义变量 DateTime date1 = new DateTime(2018, 4, 30); DateTime date2 = new DateTime(2018, 4, 30); string targetLeaveTypeId = "1"; string targetUserId = "5dc64ba7-8cf8-45dd-80f2-a8700e7dad2e"; DateTime targetFromDate = new DateTime(2018, 4, 30);
然后用LINQ构建查询,完全对应SQL的逻辑:
// 假设你的DbContext实例是db var totalDays = db.LeaveRequestModels // 对应SQL中的WHERE条件 .Where(lr => lr.leaveTypeId == targetLeaveTypeId && lr.requestUserId == targetUserId && lr.FromDate == targetFromDate) // 对应SQL中的DATEDIFF(Day, ...) .Select(lr => DbFunctions.DiffDays(date1, date2)) // 对应SQL中的SUM(),用?? 0处理无匹配数据时的null情况 .Sum() ?? 0;
关键说明:
DbFunctions.DiffDays是Entity Framework中对应SQLDATEDIFF(Day, start, end)的方法,参数顺序要和SQL保持一致- 原SQL中的
2018-04-31是无效日期,所以我调整成了2018-04-30,你可以根据实际需求替换成视图模型里的日期属性 Sum() ?? 0是为了避免没有匹配数据时返回null,如果你的业务允许返回null,可以去掉?? 0
内容的提问来源于stack exchange,提问作者A Koul
相关产品推荐
相关产品推荐

