“Le membre de type spécifié ‘Date’ n’est pas pris en charge dans LINQ”

_dbEntities.EmployeeAttendances.Where(x => x.DailyDate.Date.Equals(DateTime.Now.Date)).ToList(); 

“Le type de membre 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.”

Comment puis-je obtenir des données sur les employés en fonction de la date du jour dans la requête linq?

EntityFramework ne peut pas convertir DateTime.Date en SQL. Donc, il ne parvient pas à générer le SQL attendu. Au lieu de cela, vous pouvez utiliser la EntityFunctions.TruncateTime() ou DbFunctions.TruncateTime() (basée sur la version EF ) si vous souhaitez obtenir le composant Date uniquement:

  _dbEntities.EmployeeAttendances .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date) .ToList(); 

Information additionnelle:

EntityFunctions méthodes EntityFunctions sont appelées fonctions canoniques . Et ce sont un ensemble de fonctions, qui sont sockets en charge par tous les fournisseurs Entity Framework. Ces fonctions canoniques seront traduites dans la fonctionnalité de source de données correspondante pour le fournisseur. Les fonctions canoniques sont le moyen privilégié pour accéder aux fonctionnalités en dehors de la langue principale, car elles permettent de garder les requêtes portables.

Vous pouvez trouver toutes les fonctions canoniques ici et toutes les fonctions canoniques date et heure ici .

Mettre à jour:

Depuis EF6, EntityFunctions est déconseillé pour System.Data.Entity.DbFunctions .

Ne pas utiliser EntityFunctions dans EF 6. TruncateTime est dans la classe DbFunctions:

 DbFunctions.TruncateTime(x.DailyDate) 

Si la propriété DailyDate est déjà juste une date, au lieu d’une date et d’une heure, il serait alors plus simple d’utiliser simplement:

 // Outside the query so it becomes a constant, effectively var today = DateTime.Today; var employees = _dbEntities.EmployeeAttendances .Where(x => x.DailyDate == today) .ToList(); 

Si cela échoue (ce qui fait échouer ce qui précède), vous pouvez toujours utiliser:

 // Outside the query so it becomes a constant, effectively var today = DateTime.Today; var tomorrow = today.AddDays(1); var employees = _dbEntities.EmployeeAttendances .Where(x => x.DailyDate >= today && x.DailyDate < tomorrow) .ToList(); 

... ou utilisez TruncateTime comme le suggère la réponse de Farhad. Je vous recommande quand même d’évaluer DateTime.Today premier:

 var today = DateTime.Today; var employees = _dbEntities.EmployeeAttendances .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == today) .ToList(); 

Notez que Today (comme DateTime.Now ) utilise le fuseau horaire par défaut du système. Vous devriez bien réfléchir à la question de savoir si c'est ce que vous voulez.

Juste au cas où cela pourrait aider quelqu’un … Dans EF 6, EntityFunctions est obsolète, utilisez plutôt la classe DbFunctions . Vous voudrez peut-être inclure le Namespace System.Data.Entity;

par exemple:

 _dbEntities.EmployeeAttendances.Where(x => DbFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date).ToList();