À l'aide de ce code dans Entity Framework je reçois le message d'erreur suivant. Je dois 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 not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}
Des idées comment résoudre ce problème?
DateTime.Date
ne peut pas être converti en SQL. Utilisez EntityFunctions.TruncateTime méthode pour obtenir un élément de date.
var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
UPDATE: Comme @shankbond mentionné dans les commentaires, dans Entity Framework 6 EntityFunctions
est obsolète et vous devez utiliser DbFunctions
class, fourni avec Entity Framework.
Vous devriez maintenant utiliser DbFunctions.TruncateTime
var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
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 ça aide.
EntityFunctions
est obsolète. Pensez à utiliser DbFunctions
à la place.
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Utilisez toujours EntityFunctions.TruncateTime () pour x.DateTimeStart et currentDate . Tels que:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
Il suffit d'utiliser 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 date plus complexes, vérifiez alors Fonctions canoniques 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 bases de mémoire, mais pas dans EF.
Utilisez le code ci-dessous pour utiliser EF6:
(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Simplifié:
DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
Une autre solution pourrait être:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
.Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();