【问题标题】:SQL Conversion to Linq conversion for .NET Core.NET Core 的 SQL 转换为 Linq 转换
【发布时间】:2021-09-08 20:58:57
【问题描述】:

这是我的 SQL 查询。我正在尝试使用 linq 查询在我的 .NET Core Web 应用程序中产生相同的结果。

SELECT * 
FROM dbo.BUD
WHERE LEFT(PeriodD, 4) = YEAR(GETDATE())

这是我在 linq 查询中尝试过但没有成功的方法

List<SelectListItem> budNames = _ctx.Budgets.AsNoTracking()     
            .Where(n => (n.Period, 4) == GETDATE())  
            .Select(n => new SelectListItem
                             {
                                 // values
                             }).ToList();

【问题讨论】:

  • n.Period 是 DateTime 类型吗?
  • 它是一个字符字段 YYYYMM,很抱歉这可能会有所帮助。
  • 比较必须包括YEAR(GETDATE()) - 否则,你是在比较一个特定的时刻 - 而不是一整年!

标签: linq .net-core


【解决方案1】:

主要是这一行给你带来了问题:

.Where(n=> (n.Period,4) == GetDate())  

要获取字符串的前 4 个字符,请使用 Substring 方法:

n.Period.Substring(0, 4) // beginn 0 away from the first char, take 4 of them

要了解当年的情况 (DateTime):

var currentYear = DateTime.Now.ToString("yyyy");

应用于您的示例:

var currentYear = DateTime.Now.ToString("yyyy");
List<SelectListItem> budNames = _ctx.Budgets.AsNoTracking()     
    .Where(n => n.Period.Substring(0, 4) == currentYear)  
    .Select(n => new SelectListItem
    {
        // values
    }).ToList();

或者,您可以使用 StartsWith 方法:

var currentYear = DateTime.Now.ToString("yyyy");
List<SelectListItem> budNames = _ctx.Budgets.AsNoTracking()     
    .Where(n => n.Period.StartsWith(currentYear))  
    .Select(n => new SelectListItem
    {
        // values
    }).ToList();

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多