我正在计算员工的生日。问题是 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)”方法,并且该方法无法转换为存储表达式
我该如何解决?
谢谢
出现此问题的原因是 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
}
}