J'essaie de faire fonctionner cet algorithm de sorting avec IQueryable.OrderBy()
:
https://www.dotnetperls.com/alphanumeric-sorting
J'ai la class AlphanumComparatorFast
implémentée et mon code ressemble à ceci:
return this.DbContext.IssuesAccessView.AsQueryable() .Include(r => r.Issue) .Include(r => r.Issue.IssueAttachments) .Include(r => r.Issue.IssueParticipants) .Where(x => x.UserId == userId) .Select(y => y.Issue) .OrderBy(p => p.IssueNumber, new AlphanumComparatorFast());
Il se comstack bien mais Linq n'a aucune idée de ce qu'il peut faire à l'exécution car il ne peut pas traduire AlphanumComparatorFast
en SQL, donc j'ai cette erreur
"Cette méthode ne peut pas être traduite en une expression de magasin."
La key ici est que je ne veux pas perdre l'interface IQueryable
. Je dois returnner queryable pour l'exécution retardée.
Donc, ma question est, quelqu'un peut-il penser à un moyen de faire cela? Ai-je besoin d'utiliser une fonction SQL (ou une telle fonction) ou est-ce possible avec IQueryable
?
Je vous remercie!
METTRE À JOUR
Merci à CodeNotFound de répondre que j'ai besoin de créer une fonction SQL pour le faire.
J'ai créé une fonction et j'essaie de l'appeler à partir de C # EF6 Code First (pas de files edmx) le problème est que je ne peux pas find un bon exemple de la façon de le faire. Le plus proche que j'ai obtenu est celui-ci:
[Function(Name = "dbo.fn_CreateAlphanumericSortValue", IsComposable = true)] [return: Parameter(DbType = "VarChar(100)")] public ssortingng ReverseCustName([Parameter(Name = "ssortingng", DbType = "VarChar(100)")] ssortingng @ssortingng) { return ((ssortingng)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), @ssortingng).ReturnValue)); }
Le problème ici est que ceci est de Linq à SQL et utilise la fonction DataContext.ExecutMethodCall
au lieu de l'object DBContext
utilisé dans EF 6 et il semble qu'il n'y ait pas de méthode équivalente dans DBContext
Toute aide sur la façon de le faire dans EF6 (code d'abord, pas de files .edmx) serait appréciée
Vous avez l'erreur suivante
"Cette méthode ne peut pas être traduite en une expression de magasin."
Parce que votre requête doit être traduite en instructions SQL, il n'y a pas de clause disponible en SQL pouvant être mappée avec AlphanumComparatorFast
.
Ai-je besoin d'utiliser une fonction SQL (ou une telle fonction) ou est-ce possible avec IQueryable?
Oui, vous devez traduire la logique de votre sorting écrit en C # composable avec SQL en créant une fonction SQL côté server et l'utiliser dans votre requête Linq to Entites.