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

标签 c# .net entity-framework linq

因为如果您尝试在 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/

相关文章:

c# - .net framework 4.0 的 File.ReadLines(..) 方法中的错误

c# - Azure Function (v1) 中的 ValueTuple 问题

c# - CallContext 与 ThreadStatic

c# - Linq 到 XML 联接

c# - 使用 FFMPEG(c# 应用程序)向视频添加文本

c# - 我应该如何处理此 C# 函数中的异常?

entity-framework - Entity Framework - 没有配置的数据库优先

c# - 返回任何类型的 IQueryable

c# - MVC - Entity Framework - 这属于哪里?

C# VS : How to make the changes constant every time the form is loaded