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?

GibboK
la source
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.

Sergey Berezovskiy
la source
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();
WaZ
la source
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.

jvrdelafuente
la source
15

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

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Leonel Sanches da Silva
la source
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));
Babul Mirdha
la source
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.

phil soady
la source
3

Simplifié:

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

Utilisez le code ci-dessous pour utiliser EF6:

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

Une autre solution pourrait être:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
cozmin-calin
la source