Conversion de chaîne en chaîne longue ... dans LINQ vers Entity Framework à l'aide d'un adaptateur MySQL

entity-framework linq linq-to-entities mysql type-conversion

Question

J'ai une table avec une colonne de type varchar où la majorité des lignes ont des valeurs d'apparence numériques, c'est-à-dire que chaque chaîne ne contient que les chiffres de 0 à 9.

+------+
|  n   |
+------+
| 123  |
| 234  |
| BLAH |  -- This row is an exception to the rule.
| 456  |
| 789  |
+------+

Cela fonctionne dans MySQL: SELECT * FROM t WHERE n >= 200 AND n <= 500;
renvoyer des lignes avec où n a la valeur 234 et également 456 pour les données ci-dessus.

J'aimerais pouvoir utiliser LINQ avec Entity Framework faire la même chose.

var results = from n in context.t  
              let n_asLong = long.Parse(n)  // ...I know, see note below...
              where ( n != null && n_asLong >= lowVal && n_asLong <= hiVal )
              select n_asLong;

    REMARQUE: Oui, je suis conscient que long.Parse() une exception lorsqu'il atteint le long.Parse() invalide. Pour le moment, mes exemples de données ne contiennent que des chaînes juridiquement analysables. J'ai inclus un élément non numérique dans l'espoir d'une réponse complète et globale.

L'exécution de ce code entraîne une exception concernant le codage LINQ:
LINQ to Entities ne reconnaît pas la méthode Int64 (méthode System), et cette méthode ne peut pas être traduite en une expression de magasin.

Je comprends pourquoi, qu’il veuille faire la conversion en SQL.

En fait, j'ai effectué une expérience avec MS-SQL et ai dû exporter une fonction personnalisée chaîne-longue qui prenait connaissance des données incorrectes (renvoyant 0 pour des valeurs non numériques telles que 'BLAH'), et fonctionnant avec LINQ to SQL , bien que ce fût une solution de contournement beaucoup plus compliquée que je l’aurais souhaité.

Il se trouve que je suis enfermé dans une solution MySQL. Donc, le hack spécifique au vendeur ci-dessus ne fonctionnera pas.

Je ne peux m'empêcher de penser qu'il doit exister un moyen de traiter une chaîne comme une valeur (même le SQL natif le permet) et le faire avec LINQ to Entity Frameworks.

Des bonnes approches de certains experts en bases de données / C # / .NET / LINQ?

Si nécessaire, je suis prêt à fournir une solution honteuse d'exécution-raw-SQL-directement s'il n'en existe aucune autre.

Réponse acceptée

Nous avons fini par faire du punting.

Apparemment, Entity Framework, pensant travailler uniquement avec des objets, souhaite toujours effectuer une vérification de type forte, tout en ne disposant pas de mécanisme de conversion entre types à des fins de comparaison dans le code SQL.

De manière choquante, même CONVERT( "1234", UNSIGNED ) , fourni par MySQL, ne peut pas être encodé, encore moins une solution avec Int64.Parse() .

MySqlConnection fini par accéder à du SQL brut via MySqlConnection / MySqlCommand / MySqlDataReader .


Réponse populaire

Vous pouvez utiliser "Convert", le fournisseur peut traduire cela.

var results = from n in context.t  
              let n_asLong = Convert.ToInt64(n) // -- Here is the magic
              where ( n != null && n_asLong >= lowVal && n_asLong <= hiVal )
              select n_asLong;

(Au moins, cela a fonctionné pour moi avec SQL Server Express et LINQPad)



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow