Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Convertir un int en String avec Linq to Entity – Utilisation de Entity SQL - LINQ to Entities does not recognize the method 'System.String ToString()' method

Dans certains cas, on a besoin de faire une recherche dans la base afin de savoir si un nombre contient un certain fragment. Par exemple si vous avez une table contenant des grands entiers, vous aimerez pouvoir rechercher toutes les lignes dont le nombre possède 23 (123, 242354, …)

La requête SQL est simple :

SELECT * FROM dbo.Person WHERE Num LIKE '%12%';

Avec Linq To Entity, la requête devrait ressembler à :

IEnumerable<Person> persons = entities.Person .Where(p => p.Num.ToString().Contains("12"));

Afin de reproduire le comportement du Like, on est obligé de convertir notre entier en String et d’utiliser la méthode Contains. Si l’on exécute ce code, alors on obtient une exception :

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

Malheureusement, je n’ai pas trouvé de solution pour convertir un entier en String avec Linq To Entities. Une des solutions est de convertir notre IQueryable en IEnumerable, c’est à dire de récupérer l’ensemble des éléments coté .net puis de faire le where en Linq to Object, niveau performance ce n’est pas jouable !

L’autre solution est d’utiliser du entity SQL :

IEnumerable<Person> persons = entities.Person .Where("cast(it.Num as System.String) like '%' + @nb + '%'", new ObjectParameter("nb", 10.ToString()));

Ainsi, la requête générée par le moteur Linq To Entities est correctement traduite en SQL.

Je trouve étonnant que l’équipe de Linq To Entities, ne propose pas de solution simple pour résoudre ce problème. Lors du parsing de l’expression, il me semble simple de traduire int.ToString en cast( … as System.String), cela pose peut être quelques problèmes au niveau des cultures, mais je ne pense pas que cela soit bloquant.

Je n’ai pas testé avec EF4 (Entity Framework de .net 4), quelqu’un sait si ce cas sera plus simple avec EF4 ? une autre solution ?

Posted: vendredi 4 septembre 2009 10:49 par cyril
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

nfaugout a dit :

Peux-tu expliquer le mot clé "it" dans le cast ?

Ca représente l'objet Person courant ?

Merci.

# septembre 29, 2009 18:14

cyril a dit :

J'avais cherché de la doc à ce propos, et je n'avais pas trouvé grand chose.

"it" correspond bien à l'objet courant. J'ai seulement vu des exemples utilisant ceci ainsi, aucune explication sur it dans MSDN.

Si quelqu'un a, je suis preneur.

# septembre 29, 2009 23:10

DonJeremy a dit :

je sais qu'en Linq, il y a une classe coté Linq client, "SqlMethods", permettant d'utiliser un "Like", et opérations sur les dates comme "DateAdd".

Le problème est toujours le même, c'est qu'il faut comparer deux string. Mais serait-il possible d'hériter de cette classe pour ajouter des méthodes de conversion ? A travailler dessus, je pense.

lien msdn:

http://msdn.microsoft.com/fr-fr/library/system.data.linq.sqlclient.sqlmethods.like.aspx

# octobre 13, 2009 10:21
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01