因为如果您尝试在 LINQ 表达式中使用 DateTime,您将得到:
LINQ to Entities 仅支持无参数构造函数和初始化器。
最好的方法是使用 DbFunctions.CreateDateTime 方法
:https://msdn.microsoft.com/en-us/library/dn218443(v=vs.113).aspx
无效示例:
await ctx.Example.AsNoTracking()
.Where(e => e.Id == id)
.Select(e => new EducationDTO {
StartDate = new DateTime(e.StartDate, 1, 1)
EndDate = new DateTime(e.EndDate, 1, 1)
})
.ToListAsync().ConfigureAwait(false);
尝试示例:
await ctx.Example.AsNoTracking()
.Where(e => e.Id == id)
.Select(e => new EducationDTO {
StartDate = DbFunctions.CreateDateTime(e.StartDate, 1, 1, null, null, null) ?? DateTime.Now,
EndDate = DbFunctions.CreateDateTime(e.EndDate, 1, 1, null, null, null) ?? DateTime.Now,
})
.ToListAsync().ConfigureAwait(false);
在我尝试使用 CreateDateTime
示例时,CreateDatetime 将为 null,我将只获取 DateTime.Now
。
我做错了什么?
最佳答案
假设非工作示例是正确的(即 e.StartDate
/e.EndDate
是 int
并且代表年份)并且唯一问题是不受支持的 DateTime
构造函数。
如您所述,正确的方法是 DbFunctions.CreateDateTime
,它具有以下签名:
public static Nullable<DateTime> CreateDateTime(
Nullable<int> year,
Nullable<int> month,
Nullable<int> day,
Nullable<int> hour,
Nullable<int> minute,
Nullable<double> second
)
文档中没有提到的(尽管这是典型的数据库表达式行为)是当任何参数为null时,结果为
。这也意味着如果所有参数不 null
null
... - 事实上,结果不是null
所以,在你的场景中正确的用法应该是这样的:
.Select(e => new EducationDTO {
StartDate = DbFunctions.CreateDateTime(e.StartDate, 1, 1, 0, 0, 0).Value,
EndDate = DbFunctions.CreateDateTime(e.EndDate, 1, 1, 0, 0, 0).Value,
})
关于c# - 如何在 LINQ to 实体表达式中使用 CreateDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384150/