How to use CreateDateTime in LINQ for entity expressions

Because if you try to use DateTime in LINQ expressions, you will get:

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

The best way is to use DbFunctions.CreateDateTime Method: https://msdn.microsoft.com/en-us/library/dn218443(v=vs.113).aspx

Example does not work:

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);

An example of an attempt:

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);

In an attempt to use the example CreateDateTime, CreateDatetime will be null, and I just get it DateTime.Now.

What am I doing wrong?

+4
source share
2 answers

, (.. 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,
})
+4

- ?

- 100% /. DateTime DateTime?, , ..

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
1/1/2016 12:00:00 AM

StartDate = e.StartDate.SpecialDate()
+1

Source: https://habr.com/ru/post/1659623/


All Articles