LINQ to Entities 无法识别“System.DateTime ParseExact(System.String, System.String, System.IFormatProvider)”方法

问题描述 投票:0回答:1

我正在计算员工的生日。问题是 DateOfBirth 列数据类型在数据库中是 varchar (字符串),我无法更改它。其他人在系统中创建了它。出生日期以英国格式保存,即 dd/MM/yyyy。

这是代码:

public void GetBirthdays()
{
    int dateOffset = 3;

    DateTime today = DateTime.Today;
    DateTime maxDate = DateTime.Today.AddDays(dateOffset);

   using (var ctx = new ctxEntities())
    {
         var staff = (from s in ctx.Employees
              let date = DateTime.ParseExact(s.DateOfBirth, "dd/MM/yyyy", null)
              where date >= today
              && date <= maxDate
             );

        var list = staff.ToList(); //Exception on this line, which is mentioned below.
    }
  }

这是例外:

LINQ to Entities 无法识别“System.DateTime ParseExact(System.String, System.String, System.IFormatProvider)”方法,并且该方法无法转换为存储表达式

我该如何解决?

谢谢

sql-server asp.net-mvc entity-framework
1个回答
0
投票

出现此问题的原因是 LINQ to Entities 仅翻译可转换为 SQL 的表达式,而

DateTime.ParseExact
无法翻译。

要解决此问题,您可以从数据库中以字符串形式检索数据,然后使用

AsEnumerable()
将其解析为内存中的 DateTime。以下是修改代码的方法:

public void GetBirthdays()
{
    int dateOffset = 3;
    DateTime today = DateTime.Today;
    DateTime maxDate = DateTime.Today.AddDays(dateOffset);

    using (var ctx = new ctxEntities())
    {
        var staff = ctx.Employees
            .AsEnumerable() // Switch to LINQ to Objects
            .Select(s => new 
            {
                Employee = s,
                DateOfBirth = DateTime.TryParseExact(s.DateOfBirth, "dd/MM/yyyy", 
                    null, System.Globalization.DateTimeStyles.None, out var date) 
                    ? date 
                    : (DateTime?)null
            })
            .Where(s => s.DateOfBirth.HasValue 
                     && s.DateOfBirth.Value >= today 
                     && s.DateOfBirth.Value <= maxDate)
            .Select(s => s.Employee)
            .ToList();
        
        // Use the 'staff' list as needed
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.