La date de formatage dans la requête Linq-to-Entities provoque une exception

J’ai une classe Entity avec datetime, je souhaite sélectionner une valeur de classement datetime au format «mon-aaaa» distincte et une liste déroulante à remplir

le code suivant me donne l’erreur:

var env = db.Envelopes.Select(d => new { d.ReportDate.Year, d.ReportDate.Month, FormattedDate = d.ReportDate.ToSsortingng("yyyy-MMM") }).Select(d => d.FormattedDate) List _months = new List(); foreach (var mname in env) { _months.Add(new SelectListItem() { Text = mname, Value = mname }); } 

Message d’erreur:

LINQ to Entities ne reconnaît pas la méthode “System.Ssortingng ToSsortingng (System.Ssortingng)” et cette méthode ne peut pas être traduite en une expression de magasin.

Comment puis-je corriger ce message d’erreur?

Merci SR

N’oubliez pas que votre requête va être traduite en SQL et envoyée à la firebase database. Votre tentative de formater la date n’est pas prise en charge dans la requête, raison pour laquelle vous voyez ce message d’erreur particulier. Vous devez récupérer les résultats, puis les formater une fois les données matérialisées.

Une option consiste à sélectionner simplement la date telle quelle. Lorsque vous parcourez le résultat, formatez-le au fur et à mesure que vous l’ajoutez à votre liste. Mais vous pouvez également réaliser la construction de la liste avec la date formatée en une seule instruction en utilisant une méthode de chaînage.

 List _months = db.Envelopes.OrderByDescending(d => d.ReportDate) .Select(d => d.ReportDate) .AsEnumerable() // <-- this is the key method .Select(date => date.ToSsortingng("MMM-yyyy")) .Distinct() .Select(formattedDate => new SelectListItem { Text = formattedDate, Value = formattedDate }) .ToList(); 

La méthode .AsEnumerable() forcera l’exécution de la première partie de la requête sur la firebase database et le rest travaillera avec les résultats en mémoire.

Voici une alternative:

 .Select( p -> SqlFunctions.SsortingngConvert((double) SqlFunctions.DatePart("m", p.modified)).Trim() + "/" + // SqlFunctions.DateName("mm", p.modified) + "/" + MS ERROR? SqlFunctions.DateName("dd", p.modified) + "/" + SqlFunctions.DateName("yyyy", p.modified) 

Apparemment DateName("MM", ..) épelle le nom du mois où DatePart("mm", ..) fournit une valeur numérique, donc SsortingngConvert( ) , mais cette dernière SsortingngConvert( ) le résultat avec des espaces, ainsi le .Trim() .

Comme Anthony Pegram l’a dit plus haut, cela se produit dans la firebase database plutôt que dans C # ( .AsEnumerable() extrait toutes les données locales vers C #, assurez-vous donc de les filtrer avant de les utiliser.)

Évidemment, vous voudrez réorganiser légèrement la sortie pour l’adapter à yyyy-MM et utiliser DatePart pour le chiffre ou DateName pour le nom du mois.

Voici une alternative qui utilise le format commun jj / mm / aaaa. Confirmé sur SQL Server 2012 avec Entity Framework 5

 invoices.Select(i => new { FormattedDate = ( EntityFunctions.Right(Ssortingng.Concat(" ", SqlFunctions.SsortingngConvert((double?) SqlFunctions.DatePart("dd", i.DocumentDate))), 2) + "/" + EntityFunctions.Right(Ssortingng.Concat(" ",SqlFunctions.SsortingngConvert((double?) SqlFunctions.DatePart("mm", i.DocumentDate))), 2) + "/" + EntityFunctions.Right(SqlFunctions.SsortingngConvert((double?) SqlFunctions.DatePart("yyyy", i.DocumentDate)), 4) ).Replace(" ", "0") } 

Produit des dates au format jj / mm / aaaa avec des zéros non significatifs.

J’ai utilisé une solution de contournement pour créer les formats contenant yyyy et MM manuellement. Je voudrais le mentionner ici si cela peut aider quelqu’un (au moins temporairement):

 FormattedDate = d.ReportDate.Year.ToSsortingng() + "-" + d.ReportDate.Month.ToSsortingng() 

cela rend le format yyyy-MM