2016-11-23 5 views
2

Ich habe die folgende Funktion LINQ in meinem .net appDbFunctions.TruncateTime LINQ Äquivalent in ASP .NET CORE

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

Wenn ich dies in ASP .NET CORE verwenden, kann ich nicht DbFunctions verwenden. Wie kann ich das umschreiben, damit es in Microsoft.EntityFrameworkCore funktioniert? Ich verwende SQLite, wenn das einen Unterschied macht.

Antwort

3

DbFunctions werden für EF Core noch nicht unterstützt. Sie können jedoch "Raw Sql Queries" verwenden.

Sie können "Raw Sql Queries" here

Dokumentation finden und auch können Sie here für DbFunctions für EF-Core

+2

100 für die Bereitstellung von Tracking-Link !, jetzt sehe ich, dass .NET Core 2.0 EF.Functions hat. –

7

In EF6 verfolgen DbFunctions.TruncateTime weil aus irgendeinem Grund statt DateTime.Date Eigenschaft verwendet wird, die später nicht unterstützt wird.

In EF Core wird das vorherige nicht benötigt, weil DateTime.Date jetzt korrekt erkannt und übersetzt wird.

group events by events.DateTimeFrom.Date into dateGroup 

Leider gibt es keine Dokumentation (noch) nicht von dem, was unterstützt wird, um eine allgemeine Faustregel gilt immer die entsprechende CLR-Methode/Eigenschaft versuchen (falls vorhanden) und überprüfen, ob es zu SQL übersetzt und wie.

0

Ich schaffte es, dies in Lambda auch neu zu schreiben und es async zu machen. Scheint genauso zu funktionieren.

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