Question

Je voudrais trier ma liste par une chaîne convertie en int :

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();

mais obtenez :La méthode 'ToInt32' n'est pas prise en charge.

Était-ce utile?

La solution

Je suis l'un des développeurs de LightSpeed.

Le fournisseur LINQ dans LightSpeed ​​3.11 RTM ne prend pas en charge Convert.ToInt32.Cependant, nous avons désormais ajouté un support via une version nocturne disponible en téléchargement dès maintenant.

Si vous ne souhaitez pas utiliser la version nocturne, vous pouvez obtenir le résultat souhaité en accédant à l'API Query Objects et en appelant directement la fonction SQL CAST.Cela ressemblera à quelque chose comme :

Query query = new Query
{
  Order = Order.By(Entity.Attribute("Number")
                         .Function("CAST", new LiteralExpression("INTEGER") { EmitInline = true }))
};

uow.Find<RfidTag>(query);

La raison de la LiteralExpression plutôt verbeuse pour le type de conversion est que, par défaut, LightSpeed ​​envoie des valeurs à la base de données via des paramètres (pour éviter les attaques par injection SQL).Mais pour la fonction CAST, le moteur SQL doit voir CAST(Number, INTEGER) plutôt que CAST(Number, @p0) où p0 a la valeur "INTEGER".Vous devez donc utiliser une expression EmitInline, qui contourne le paramétrage, plutôt que la chaîne littérale plus naturelle.

Encore une fois, cependant, la version nocturne prend en charge Convert.ToInt32 dans LINQ, vous n'avez donc qu'à descendre à ce niveau si vous souhaitez éviter de prendre une version nocturne.

Autres conseils

Qu'en est-il de:

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => t.Number).ToList();

supprimer n'importe quelle méthode CLR pour que ORM puisse le transformer en une requête SQL connue

Edit: je viens de lire en voulant le convertir en premier:

var orderedListOfRfidTags = uow.RfidTags.ToList().OrderBy(t => Convert.ToInt32(t.Number));

Soit pour obtenir tout de DB, commandez-le sur le client (Linq à l'objet) comme je l'ai mentionné précédemment, soit trouver une méthode sur votre ORM à lancer pour le commander. Avant de commander, sélectionnez une nouvelle liste avec un nombre converti, puis commandez par lui.

Edit2:

Qu'en est-il de la distribution directe fonctionne-t-elle avec cet orm?

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => (int)t.Number).ToList();
var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));

Je ne sais pas quel type de type "rfidtags" est, et je ne connais pas non plus l'orm LightSpeed, mais je sais que lorsque j'ai eu des problèmes similaires avec Linq à SQL me disant qu'une méthode particulière que j'essaie d'invoquer Une clause WHERE ou ORDERBY n'est pas prise en charge, puis je change simplement les choses pour que je traite avec un vieux linq simple.

Par exemple, pourriez-vous essayer cela?

var listOfRfidTags = uow.RfidTags.ToList();
var orderedListOfRfidTags = listOfRfidTags.OrderBy(t => Convert.ToInt32(t.Number));

(Oui, il est possible de combiner cela en une seule ligne, mais il est montré ici sur deux lignes pour plus de clarté.)

Bonne chance!

Essayez d'utiliser int.Parse au lieu de Convertir.Il est probable que Lightspeed prenne en charge l'un sans prendre en charge l'autre.

var orderedListOfRfidTags = uow.RfidTags
    .OrderBy(t => int.Parse(t.Number))
    .ToList();

Alors, voici ma solution à ce problème:

var query = (from q in query select q).ToList().Where(x => Convert.ToInt32(x.col_string) > 0);

J'ai d'abord lancé l'iQueryable sur une liste, puis j'ai converti la colonne de la chaîne de type de données en INT32 pour une utilisation dans les opérations mathématiques.

J'espère que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top