gpt4 book ai didi

c# - 如何在 LINQ to 实体表达式中使用 CreateDateTime

转载 作者:太空狗 更新时间:2023-10-30 01:01:15 25 4
gpt4 key购买 nike

因为如果您尝试在 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.EndDateint 并且代表年份)并且唯一问题是不受支持的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com