Эквивалент 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