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

Je migre certaines choses d’un serveur mysql vers un serveur sql mais je n’arrive pas à comprendre comment faire fonctionner ce code:

using (var context = new Context()) { ... foreach (var item in collection) { IQueryable pages = from p in context.pages where p.Serial == item.Key.ToSsortingng() select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); } 

Quand il entre dans la deuxième foreach (var page in pages) il lance une exception en disant:

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

Quelqu’un sait pourquoi cela se produit?

Enregistrez simplement la chaîne dans une variable temporaire, puis utilisez-la dans votre expression:

 var strItem = item.Key.ToSsortingng(); IQueryable pages = from p in context.pages where p.Serial == strItem select p; 

Le problème se pose car ToSsortingng() n’est pas vraiment exécuté, il est transformé en un MethodGroup , puis analysé et traduit en SQL. Comme il n’y a pas d’équivalent ToSsortingng() , l’expression échoue.

Remarque:

Assurez-vous également de vérifier la réponse d’Alex concernant la classe d’assistance SqlFunctions ajoutée ultérieurement. Dans de nombreux cas, cela peut éliminer le besoin de la variable temporaire.

Comme d’autres ont répondu, cela se casse car.

Toutefois, Microsoft fournit la classe SqlFunctions qui est un ensemble de méthodes pouvant être utilisées dans des situations comme celles-ci.

Pour ce cas, ce que vous cherchez ici est SqlFunctions.SsortingngConvert :

 from p in context.pages where p.Serial == SqlFunctions.SsortingngConvert((double)item.Key.Id) select p; 

Bon lorsque la solution avec des variables temporaires n’est pas souhaitable pour quelque raison que ce soit.

Semblable à SqlFunctions, vous disposez également des EntityFunctions (avec EF6 obsolète par DbFunctions ) qui fournissent un ensemble différent de fonctions qui sont également indépendantes de la source de données (pas uniquement par exemple SQL).

Le problème est que vous appelez ToSsortingng dans une requête LINQ to Entities. Cela signifie que l’parsingur tente de convertir l’appel ToSsortingng en SQL équivalent (ce qui n’est pas possible … d’où l’exception).

Il suffit de déplacer l’appel ToSsortingng vers une ligne distincte:

 var keySsortingng = item.Key.ToSsortingng(); var pages = from p in context.entities where p.Serial == keySsortingng select p; 

A eu un problème similaire. Résolu en appelant ToList () sur la collection d’entités et en interrogeant la liste. Si la collection est petite, c’est une option.

 IQueryable pages = context.pages.ToList().Where(p=>p.serial == item.Key.ToSsortingng()) 

J’espère que cela t’aides.

Changer comme ça et ça devrait marcher:

 var key = item.Key.ToSsortingng(); IQueryable pages = from p in context.pages where p.Serial == key select p; 

La raison pour laquelle l’exception n’est pas lancée dans la ligne où la requête LINQ est déclarée mais dans la ligne de foreach est la fonctionnalité d’exécution différée, c’est-à-dire que la requête LINQ n’est exécutée que lorsque vous tentez d’accéder au résultat. Et cela se produit dans le foreach et pas avant.

Cast table to Enumerable , alors vous appelez les méthodes LINQ avec l’aide de la méthode ToSsortingng() intérieur:

  var example = contex.table_name.AsEnumerable() .Select(x => new {Date = x.date.ToSsortingng("M/d/yyyy")...) 

Mais soyez prudent lorsque vous appelez les méthodes AsEnumerable ou ToList , car vous demanderez toutes les données à toutes les entités avant cette méthode. Dans mon cas ci-dessus, je lis toutes les lignes table_name par une requête.

Si vous voulez vraiment taper ToSsortingng dans votre requête, vous pouvez écrire un visiteur de l’arborescence d’expression qui réécrit l’appel à ToSsortingng avec un appel à la fonction SsortingngConvert appropriée :

 using System.Linq; using System.Data.Entity.SqlServer; using System.Linq.Expressions; using static System.Linq.Expressions.Expression; using System; namespace ToSsortingngRewriting { class ToSsortingngRewriter : ExpressionVisitor { static MethodInfo ssortingngConvertMethodInfo = typeof(SqlFunctions).GetMethods() .Single(x => x.Name == "SsortingngConvert" && x.GetParameters()[0].ParameterType == typeof(decimal?)); protected override Expression VisitMethodCall(MethodCallExpression node) { var method = node.Method; if (method.Name=="ToSsortingng") { if (node.Object.GetType() == typeof(ssortingng)) { return node.Object; } node = Call(ssortingngConvertMethodInfo, Convert(node.Object, typeof(decimal?)); } return base.VisitMethodCall(node); } } class Person { ssortingng Name { get; set; } long SocialSecurityNumber { get; set; } } class Program { void Main() { Expression> expr = x => x.ToSsortingng().Length > 1; var rewriter = new ToSsortingngRewriter(); var finalExpression = rewriter.Visit(expr); var dcx = new MyDataContext(); var query = dcx.Persons.Where(finalExpression); } } } 

Dans MVC, supposez que vous recherchez des enregistrements en fonction de vos besoins ou de vos informations. Il fonctionne correctement.

 [HttpPost] [ActionName("Index")] public ActionResult SearchRecord(FormCollection formcollection) { EmployeeContext employeeContext = new EmployeeContext(); ssortingng searchby=formcollection["SearchBy"]; ssortingng value=formcollection["Value"]; if (formcollection["SearchBy"] == "Gender") { List emplist = employeeContext.Employees.Where(x => x.Gender == value).ToList(); return View("Index", emplist); } else { List emplist = employeeContext.Employees.Where(x => x.Name == value).ToList(); return View("Index", emplist); } } 

La mise à niveau vers Entity Framework version 6.2.0 a fonctionné pour moi.

J’étais auparavant sur la version 6.0.0.

J’espère que cela t’aides,

J’ai eu la même erreur dans ce cas:

 var result = Db.SystemLog .Where(log => eventTypeValues.Contains(log.EventType) && ( search.Contains(log.Id.ToSsortingng()) || log.Message.Contains(search) || log.PayLoad.Contains(search) || log.Timestamp.ToSsortingng(CultureInfo.CurrentUICulture).Contains(search) ) ) .OrderByDescending(log => log.Id) .Select(r => r); 

Après avoir passé beaucoup trop de temps à déboguer, j’ai compris que l’erreur apparaissait dans l’expression logique.

La première ligne search.Contains(log.Id.ToSsortingng()) fonctionne search.Contains(log.Id.ToSsortingng()) , mais la dernière ligne qui concerne un object DateTime a échoué lamentablement:

 || log.Timestamp.ToSsortingng(CultureInfo.CurrentUICulture).Contains(search) 

Supprimez la ligne problématique et le problème résolu.

Je ne comprends pas bien pourquoi, mais il semble que ToSsortingng () est une expression LINQ pour les chaînes, mais pas pour les entités. LINQ for Entities traite des requêtes de firebase database telles que SQL, et SQL n’a aucune notion de ToSsortingng (). En tant que tel, nous ne pouvons pas lancer ToSsortingng () dans une clause .Where ().

Mais alors comment fonctionne la première ligne? Au lieu de ToSsortingng (), SQL a CAST et CONVERT , donc ma meilleure hypothèse est que linq pour les entités l’utilise dans certains cas simples. Les objects DateTime ne sont pas toujours aussi simples …

Il suffit de transformer la requête LINQ to Entity en une requête LINQ to Objects (par exemple, appeler ToArray) chaque fois que vous devez utiliser un appel de méthode dans votre requête LINQ.