You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:34:42