111 votes

Le type spécifié membre 'Date' n'est pas pris en charge dans LINQ to entities Exception

J'ai eu une exception lors de la mise en œuvre les instructions 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 l'exception de moyens mais je ne sais pas comment m'en débarrasser. Toute aide?

240voto

Slauma Points 76561

Vous pouvez utiliser le TruncateTime méthode de la EntityFunctions pour atteindre un corriger les traductions de l' Date de la propriété en 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: EntityFunctionsest obsolète dans EF6, Utilisez DbFunctions.TruncateTime

105voto

Judo Points 2413

LINQ to entities ne peut pas traduire la plupart .NET Date de méthodes (y compris le moulage-vous utilisé) dans SQL car il n'y a pas d'équivalent SQL.

La solution est d'utiliser les méthodes de Date à l'extérieur de l'LINQ déclaration, puis passer dans une valeur. Il semble que si Convertir.ToDateTime(règle.de données).La Date est à l'origine de l'erreur.

L'appel de Date sur un DateTime par ailleurs, la propriété ne peut pas être traduite en SQL, donc une solution de contournement consiste à comparer l' .Année .Mois et .Jour des propriétés qui peuvent être convertis en LINQ, car ils ne sont que des entiers.

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

39voto

KingOfHypocrites Points 1070

Pour EF6 utilisation DbFunctions.TruncateTime(madate) à la place.

10voto

Mahdi Shahbazi Points 120

"EntityFunctions.TruncateTime" Travaille, mais il a quelques 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 les parties de la date. parce que la requête est exécutée plus rapidement de gros volumes de données.

2voto

Caleb Kiage Points 479

Essayez d'utiliser

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

AsEnumerable() change le contexte de la requête à partir de LINQ to entities pour LINQ to Objects donc, la condition n'est pas converti en SQL

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X