J'ai eu 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 < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => 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 signifie l'exception mais je ne sais pas comment m'en débarrasser. De l'aide?
entity-framework
linq-to-entities
nébuleuse
la source
la source
.Date
.Réponses:
LINQ to Entities ne peut pas traduire la plupart des méthodes de date .NET (y compris la conversion que vous avez utilisée) en SQL car il n'existe 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 est à l'origine de l'erreur.
L'appel de Date sur une propriété DateTime ne peut pas non plus être traduit en SQL, une solution de contournement consiste donc à comparer les propriétés .Year .Month et .Day qui peuvent être traduites en LINQ car ce ne sont que des entiers.
la source
j.JobDeadline.Date
?Vous pouvez utiliser la méthode TruncateTime des EntityFunctions pour obtenir une traduction correcte de la
Date
propriété en SQL:Mise à jour:
EntityFunctions
est obsolète dans EF6, utilisezDbFunctions.TruncateTime
la source
ruleData
c'est duDateTime
type et que le tempsj.JobDeadline
est tronqué. Ça ne va pas. Je n'ai pas eu d'exception mais n'a pas obtenu le résultat attendu.JobDeadline
a la même date querule.data
, quelle que soit l' heure de la journée . N'est-ce pas ce que vous voulez réaliser avec votre requête dans la question? Pourquoi ça ne va pas?EntityFunctions
c'est obsolète dans EF6, vous devez maintenant utiliserDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxPour EF6, utilisez plutôt DbFunctions.TruncateTime (mydate).
la source
"EntityFunctions.TruncateTime" ou "DbFunctions.TruncateTime" dans ef6 fonctionne mais il a des problèmes de performances dans le Big Data.
Je pense que la meilleure façon est d'agir comme ceci:
c'est mieux que d'utiliser des parties de la date à. car la requête est exécutée plus rapidement dans les grandes données.
la source
EntityFunctions.TruncateTime
(remplacés ultérieurement parDbFunctions.TruncateTime
) sont implémentés par conversion en SQL où la date / heure est convertie en chaîne et tronquée. Cela ralentit considérablement l'exécution de la requête, proportionnellement au nombre d'enregistrements traités.Besoin d'inclure
using System.Data.Entity;
. Fonctionne bien même avecProjectTo<>
la source
Cela signifie que LINQ to SQL ne sait pas comment transformer la
Date
propriété en une expression SQL. C'est parce que laDate
propriété de laDateTime
structure n'a pas d'analogue dans SQL.la source
Cela a fonctionné pour moi.
Source: Forums Asp.net
la source
J'ai le même problème mais je travaille avec des plages de date / heure. Ma solution est de manipuler l'heure de début (avec n'importe quelle date) à 00:00:00 et l'heure de fin à 23:59:59 Donc je ne dois plus convertir mon DateTime en Date, il reste plutôt DateTime.
Si vous n'avez qu'un seul DateTime, vous pouvez également définir l'heure de début (avec n'importe quelle date) sur 00:00:00 et l'heure de fin sur 23:59:59. Ensuite, vous effectuez une recherche comme s'il s'agissait d'une période.
Vous pouvez le faire aussi avec DateTime-Range:
la source
vous pouvez obtenir Enum comme:
la source
Comme beaucoup l'ont souligné ici, l'utilisation de la fonction TruncateTime est lente.
L'option la plus simple si vous le pouvez est d'utiliser EF Core. Il peut le faire. Si vous ne pouvez pas, une meilleure alternative à la troncature est de ne pas changer du tout le champ interrogé, mais de modifier les limites. Si vous effectuez une requête de type «entre» normale où les limites inférieure et supérieure sont facultatives, ce qui suit fera l'affaire.
Fondamentalement, plutôt que de rogner PoDate à la partie Date, nous incrémentons la limite supérieure de la requête et l'utilisateur <au lieu de <=
la source