Le membre de type spécifié ‘Date’ n’est pas pris en charge dans LINQ to Exceptions Exception

J’ai reçu une exception lors de la mise en œuvre des déclarations suivantes.

DateTime result; if (!DateTime.TryParse(rule.data, out result)) return jobdescriptions; if (result  j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date ); 

Exception

 The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

Je sais ce que l’exception signifie, mais je ne sais pas comment m’en débarrasser. De l’aide?

LINQ to Entities ne peut pas traduire la plupart des méthodes .NET Date (y compris le casting que vous avez utilisé) en SQL car il n’y a pas de SQL équivalent.

La solution consiste à utiliser les méthodes Date en dehors de l’instruction LINQ, puis à transmettre une valeur. Il semble que Convert.ToDateTime (rule.data) .Date soit à l’origine de l’erreur.

La date d’appel sur une propriété DateTime ne peut pas non plus être traduite en SQL. La solution consiste donc à comparer les propriétés .Year .Month et .Day qui peuvent être traduites en LINQ car elles ne sont que des entiers.

 var ruleDate = Convert.ToDateTime(rule.data).Date; return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year && j.Deadline.Month == ruleDate.Month && j.Deadline.Day == ruleDate.Day); 

Vous pouvez utiliser la méthode TruncateTime des EntityFunctions pour obtenir une traduction correcte de la propriété Date dans SQL:

 using System.Data.Objects; // you need this namespace for EntityFunctions // ... DateTime ruleData = Convert.ToDateTime(rule.data).Date; return jobdescriptions .Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData); 

Mise à jour: EntityFunctions est obsolète dans EF6, utilisez DbFunctions.TruncateTime

Pour EF6, utilisez plutôt DbFunctions.TruncateTime (mydate).

“EntityFunctions.TruncateTime” ou “DbFunctions.TruncateTime” dans ef6 fonctionnent, mais il présente des problèmes de performances dans le Big Data.

Je pense que le meilleur moyen est d’agir comme ceci:

 DateTime ruleDate = Convert.ToDateTime(rule.data); DateTime startDate = SearchDate.Date; DateTime endDate = SearchDate.Date.AddDay(1); return jobdescriptions.Where(j.Deadline >= startDate && j.Deadline < endDate ); 

c'est mieux que d'utiliser des parties de la date pour. car la requête est exécutée plus rapidement dans les grandes données.

Essayez d’utiliser

 return jobdescriptions.AsEnumerable() .Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date ); 

AsEnumerable() bascule le contexte de la requête de LINQ vers Entities vers LINQ to Objects afin que la condition ne soit pas convertie en SQL

Cela signifie que LINQ to SQL ne sait pas comment transformer la propriété Date en une expression SQL. Cela est dû au fait que la propriété Date de la structure DateTime n’a pas d’analogique en SQL.

Cela a fonctionné pour moi.

 DateTime dt = DateTime.Now.Date; var ord = db.Orders.Where (p => p.UserID == User && p.ValidityExpiry <= dt); 

Source: Forums Asp.net

J’ai le même problème mais je travaille avec DateTime-Ranges. Ma solution consiste à manipuler l’heure de début (avec n’importe quelle date) à 00:00:00 et l’heure de fin à 23:59:59. Je ne dois donc plus convertir mon DateTime en Date, mais plutôt DateTime.

Si vous avez juste un DateTime, vous pouvez également définir l’heure de début (avec n’importe quelle date) à 00:00:00 et l’heure de fin à 23:59:59. Ensuite, vous effectuez une recherche comme s’il s’agissait d’un intervalle de temps.

 var from = this.setStartTime(yourDateTime); var to = this.setEndTime(yourDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to); 

Vous pouvez le faire aussi avec DateTime-Range:

 var from = this.setStartTime(yourStartDateTime); var to = this.setEndTime(yourEndDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);