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?


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 .


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


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.


15

EntityFunctionsist obsolet. Erwägen Sie DbFunctionsstattdessen die Verwendung .

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

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

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.


3

Vereinfacht:

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

2

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

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Eine andere Lösung könnte sein:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.