Эквивалент DbFunctions.TruncateTime LINQ в EF CORE

В моем приложении .net есть следующий функционирующий LINQ

    public ActionResult Index()
    {
        Dictionary<DateTime?, List<Event>> result;
        result = (from events in db.Events.Include("Activity")
                      where events.IsActive
                      group events by DbFunctions.TruncateTime(events.DateTimeFrom) into dateGroup
                      select new { EventDate = dateGroup.Key, Events = dateGroup.ToList() }).ToDictionary(x => x.EventDate, x => x.Events);

        return View(result);
    }

Когда я использую это в EF Core, я не могу использовать DbFunctions. Как я могу переписать это, чтобы заставить это работать в Microsoft.EntityFrameworkCore? Я использую SQLite, если это имеет значение.

Ответ 1

В EF6 DbFunctions.TruncateTime используется вместо свойства DateTime.Date, потому что по какой-то причине более поздняя версия не поддерживается.

В EF Core первое не нужно просто потому, что DateTime.Date теперь распознается и правильно переводится.

group events by events.DateTimeFrom.Date into dateGroup

К сожалению, пока нет документации о том, что поддерживается, так как общее правило всегда пытается использовать соответствующий метод/свойство CLR (если есть) и проверять, переводится ли он на SQL и каким образом.

Ответ 2

DbFunctions еще не поддерживаются для EF Core. Однако вы можете использовать "Raw Sql Queries".

Здесь вы можете найти документацию "Необработанные запросы Sql"

А также вы можете отслеживать здесь для DbFunctions для EF Core

Ответ 3

Мне также удалось переписать это в Lambda и сделать его асинхронным. Кажется, что они работают одинаково.

var temp = await _context.Events.Where(x => x.IsActive)
            .Include(a => a.Activity)
            .GroupBy(x => x.DateTimeFrom.Date)
            .Select(g => new { EventDate = g.Key, Events = g.ToList() }).ToDictionaryAsync(x => x.EventDate, x => x.Events);

Ответ 4

EF Core 2.0 теперь поддерживает сопоставление функций базы данных со статическими методами в вашем контексте.

Ознакомьтесь с разделом "Отображение скалярной функции базы данных" здесь - https://docs.microsoft.com/en-us/ef/core/what-is-new/

Ответ 5

Чтобы использовать DbFunctions в ASP.NET CORE, вы должны создать объект.

var DbF = Microsoft.EntityFrameworkCore.EF.Functions;

Теперь вы можете легко использовать его.

var now = DateTime.Now;

int count = db.Tbl.Count(w => DbF.DateDiffDay(now, w.RegisterDate) <= 3);

подробнее на github