.NET Core环境下SQL转等效LINQ查询的实现问题求助
错误原因分析
- 你写的
(n.Period, 4)是C#元组语法,完全不匹配SQL中LEFT(PeriodD, 4)截取前4位字符的逻辑 - 不能直接在LINQ语句中写SQL原生函数
GETDATE(),且你需要对比的是当前年份,不是完整的日期时间值
正确写法
情况1:PeriodD字段为字符串类型(完全匹配原SQL逻辑)
原SQL用LEFT截取前4位对比年份,对应LINQ写法如下:
List<SelectListItem> budNames = _ctx.Budgets.AsNoTracking() .Where(n => n.PeriodD.Substring(0, 4) == DateTime.Now.Year.ToString()) .Select(n => new SelectListItem { Text = n.xxx, // 替换为你要显示的字段名 Value = n.yyy.ToString() // 替换为你要存值的字段名 }).ToList();
如果要兼容PeriodD长度不足4的场景,避免索引越界,可以调整条件为:
.Where(n => n.PeriodD.Length >= 4 && n.PeriodD.Substring(0, 4) == DateTime.Now.Year.ToString())
情况2:PeriodD字段为日期类型
如果该字段实际是日期类型,建议直接用日期属性对比,性能更好:
List<SelectListItem> budNames = _ctx.Budgets.AsNoTracking() .Where(n => n.PeriodD.Year == DateTime.Now.Year) .Select(n => new SelectListItem { Text = n.xxx, Value = n.yyy.ToString() }).ToList();
这个写法会被EF Core自动翻译为等效的YEAR(PeriodD) = YEAR(GETDATE())SQL语句。
内容的提问来源于stack exchange,提问作者Andy Williams
相关产品推荐
相关产品推荐

