2016-11-02 20 views
4

因为如果你尝试使用LINQ表达式的日期时间,你会得到:如何使用CreateDateTime在LINQ到实体表达式

Only parameterless constructors and initializers are supported in LINQ to Entities.

最好的办法是使用DbFunctions.CreateDateTime Methodhttps://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

我在做什么错?

+4

什么是'e.StartDate'? –

+0

你在'e.StartDate'中期待什么? –

回答

4

假设非工作实施例是正确的(即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, 
}) 
1

将东西沿着这些线路为你工作?

免责声明 - 我仍然不能100%确定您的输入/输出情况。你有DateTimeDateTime?,你希望从和转换什么,等

创建扩展

public static class Ext 
{ 

    public static DateTime? SpecialDate(this DateTime? v) 
    { 
     if (!v.HasValue) return null; 
     return new DateTime(v.Value.Year, 1, 1); 
    } 

    public static DateTime? SpecialDate2(this DateTime? v) 
    { 
     if (!v.HasValue) return null; 
     // neither this 
     return new DateTime().AddYears(v.Value.Year - 1); 
     // or this - uses parameterized constructor 
     //return DateTime.MinValue.AddYears(v.Value.Year - 1); 
    } 
} 

使用

DateTime? dt2 = null; 
    DateTime? dt1 = DateTime.Now; 

    Console.WriteLine(dt2.SpecialDate()); 
    Console.WriteLine(dt1.SpecialDate()); 
    Console.WriteLine(dt1.SpecialDate2()); 

结果

<-- this is empty string <br> 

1/1/2016 12:00:00 AM
2016年1月1日12:00:00 AM

对你来说这将是

StartDate = e.StartDate.SpecialDate()