因为如果您尝试在 LINQ 表达式中使用 DateTime,您将获得:Only parameterless constructors and initializers are supported in LINQ to Entities.
最好的方法是使用 DbFunctions.CreateDateTime Method
: 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 将为空,我只会得到 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 entity 表达式中使用 CreateDateTime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40384150/