174 votes

Le membre de type spécifié 'Date' n'est pas supporté par LINQ to Entities. Seuls les initialisateurs, les membres de l'entité et les propriétés de navigation de l'entité sont supportés.

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, DateTimeStart est de type DataType dans ce format 2013-01-30 12:00:00.000

Code :

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

Erreur :

base {System.SystemException} = {"The specified type member 'Date' is n'est pas pris en charge par LINQ to Entities. Seuls les initialisateurs, les membres de l'entité et les propriétés de navigation des entités sont pris en charge."}

Une idée pour réparer ça ?

1 votes

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

335voto

Sergey Berezovskiy Points 102044

DateTime.Date ne peuvent pas être convertis en SQL. Utilisez EntityFunctions.TruncateTime (en anglais) pour obtenir la partie date.

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

MISE À JOUR : Comme @shankbond l'a mentionné dans les commentaires, dans Entity Framework 6 EntityFunctions est obsolète, et vous devriez utiliser DbFunctions qui est livrée avec Entity Framework.

1 votes

Je dois modifier légèrement votre version .Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date) ; faites-moi part de vos remarques.

1 votes

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

1 votes

@GibboK bien sûr, pas de problème :) C'était juste dans le but de formater une longue chaîne de caractères.

107voto

WaZ Points 386

Vous devez maintenant utiliser DbFunctions.TruncateTime

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

0 votes

1 votes

Le membre de type spécifié 'Date' n'est pas supporté par LINQ to Entities. Seuls les initialisateurs, les membres de l'entité et les propriétés de navigation de l'entité sont pris en charge.

23voto

EntityFunctions est obsolète. Envisagez d'utiliser DbFunctions à la place.

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

19voto

jvrdelafuente Points 1162

Je voudrais ajouter une solution qui m'a aidé à résoudre ce problème dans le cadre de l'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 vous aidera.

8voto

Babul Mirdha Points 769

Utilisez toujours EntityFunctions.TruncateTime() pour x.DateTimeStart et currentDate. comme par exemple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X