Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Uniquement les initialiseurs, les membres d'entité et les propriétés de navigation d'entité


138

En utilisant ce code dans Entity Framework, je reçois l'erreur suivante. J'ai besoin d'obtenir toutes les lignes pour une date spécifique, DateTimeStartest de type DataType dans ce format2013-01-30 12:00:00.000

Code:

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

Erreur:

base {System.SystemException} = {"Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge."}

Des idées comment résoudre ce problème?


Je peux utiliser x.DateTimeStart.Date dans EF Core 2.1.1
Kirsten Greed

Réponses:


271

DateTime.Datene peut pas être converti en SQL. Utilisez la méthode EntityFunctions.TruncateTime pour obtenir une partie de date.

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

MISE À JOUR: Comme @shankbond mentionné dans les commentaires, dans Entity Framework 6 EntityFunctionsest obsolète, et vous devez utiliser la DbFunctionsclasse, qui est fournie avec Entity Framework.


1
Je dois légèrement modifier votre version .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); laissez-moi savoir vos pensées
GibboK

1
J'espère que cela ne vous dérange pas J'ai édité votre réponse en ajoutant .date si vous êtes d'accord, donc juste pour référence :-) merci pour votre soutien, je l'apprécie vraiment
GibboK

1
@GibboK bien sûr, pas de problème :) C'était juste pour formater une longue chaîne.
Sergey Berezovskiy

68
EntityFunctions est obsolète, utilisez plutôt la méthode
DbFunctions.TruncateTime

1
Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.
SAR

84

Vous devriez maintenant utiliser DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.
SAR

17

Je voudrais ajouter une solution, qui m'a aidé à résoudre ce problème dans le cadre d'entité:

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

J'espère que cela aide.


15

EntityFunctionsest obsolète. Pensez à utiliser à la DbFunctionsplace.

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

8

Utilisez toujours EntityFunctions.TruncateTime () pour x.DateTimeStart et currentDate. tel que :

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

5

Utilisez simplement des propriétés simples.

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

Si les dates futures ne sont pas possibles dans votre application, alors > = x.DateTimeStart> = currentDateTime.Date est suffisant.

si vous avez des comparaisons de dates plus complexes, vérifiez les fonctions canoniques et si vous avez des fonctions EF6 + DB

Plus généralement - Pour les personnes à la recherche de problèmes Les méthodes Linq prises en charge dans EF peuvent expliquer des problèmes similaires avec les instructions linq qui fonctionnent sur les listes de base de mémoire mais pas dans EF.


3

Simplifié:

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

2

Utilisez le code ci-dessous pour utiliser EF6:

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

0

Une autre solution pourrait être:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.