Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt. Nur Initialisierer, Entitätsmitglieder und Entitätennavigationseigenschaften

138

Bei Verwendung dieses Codes in Entity Framework wird der folgende Fehler angezeigt. Ich muss alle Zeilen für ein bestimmtes Datum DateTimeStartabrufen , ist vom Typ DataType in diesem Format2013-01-30 12:00:00.000

Code:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Error:

base {System.SystemException} = {"Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entity-Mitglieder und Entity-Navigationseigenschaften unterstützt."}

Irgendwelche Ideen, wie man das Problem behebt?

GibboK
quelle
Ich kann x.DateTimeStart.Date in EF Core 2.1.1
Kirsten Greed

Antworten:

271

DateTime.Datekann nicht in SQL konvertiert werden. Verwenden Sie die EntityFunctions.TruncateTime- Methode, um den Datumsteil abzurufen .

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

UPDATE: Wie in den Kommentaren erwähnt, ist @shankbond in Entity Framework 6 EntityFunctionsveraltet, und Sie sollten die DbFunctionsKlasse verwenden, die mit Entity Framework geliefert wird .

Sergey Berezovskiy
quelle
1
Ich muss Ihre Version leicht ändern .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); Lassen Sie mich Ihre Gedanken wissen
GibboK
1
Ich hoffe es macht dir nichts aus, ich habe deine Antwort bearbeitet und .date hinzugefügt, wenn du damit einverstanden bist, also nur als Referenz :-) Danke für deine Unterstützung, ich weiß das wirklich zu schätzen
GibboK
1
@ GibboK sicher, kein Problem :) Das war nur zum Zweck der Formatierung langer Zeichenfolgen.
Sergey Berezovskiy
68
EntityFunctions ist veraltet, verwenden Sie stattdessen die DbFunctions.TruncateTime-Methode
Shankbond
1
Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätsnavigationseigenschaften unterstützt.
SAR
83

Sie sollten jetzt verwenden DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
WaZ
quelle
Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätsnavigationseigenschaften unterstützt.
SAR
17

Ich möchte eine Lösung hinzufügen, die mir geholfen hat, dieses Problem im Entity Framework zu lösen:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Ich hoffe es hilft.

jvrdelafuente
quelle
15

EntityFunctionsist obsolet. Erwägen Sie DbFunctionsstattdessen die Verwendung .

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Leonel Sanches da Silva
quelle
8

Verwenden Sie EntityFunctions.TruncateTime () immer sowohl für x.DateTimeStart als auch für currentDate. sowie :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
Babul Mirdha
quelle
5

Verwenden Sie einfach einfache Eigenschaften.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Wenn zukünftige Daten in Ihrer App nicht möglich sind, ist > = x.DateTimeStart> = currentDateTime.Date ausreichend.

Wenn Sie komplexere Datumsvergleiche haben, überprüfen Sie die Canonical-Funktionen und wenn Sie EF6 + DB-Funktionen haben

Allgemeiner - Für Personen, die nach Problemen suchen Unterstützte Linq-Methoden in EF können ähnliche Probleme mit linq-Anweisungen erklären, die auf Speicherbasislisten funktionieren, jedoch nicht in EF.

Phil Soady
quelle
3

Vereinfacht:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
Devlin Carnate
quelle
2

Verwenden Sie den folgenden Code für die Verwendung von EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Abdus Salam Azad
quelle
0

Eine andere Lösung könnte sein:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Cozmin-Calin
quelle