2010-10-29 5 views
2

Je convertis un projet en utilisant linq2sql pour utiliser une source odata. Je suis en train de rechercher un utilisateur comme ça ...LIKE dans la requête OData

FrameworkEntities db = new FrameworkEntities(
    new Uri("http://localhost/odata/FrameworkService.svc")); 
User user = db.Users.Where(
    u => SqlMethods.Like(u.UserName, UserName)).FirstOrDefault(); 

mais je reçois l'erreur « Méthode « Boolean Comme (System.String, System.String) » ne peut pas être utilisé sur le client, il est seulement traduction vers SQL. " C'était possible dans linq2sql, donc je me demandais comment je changerais ça pour que ça fonctionne avec le service d'odata. Je n'ai trouvé aucun article à ce sujet.

Répondre

2

Comme l'indique l'erreur, SqlMethods.Like() est pour la traduction en SQL. Les requêtes oData ne sont pas traduites en SQL, vous ne pouvez donc pas utiliser la méthode. Votre meilleur pari est d'utiliser IndexOf avec StringComparison.InvariantCultureIgnoreCase pour émuler une version insensible à la casse de String.Contains.

Oh ... et vous pouvez combiner vos appels à Where et FirstOrDefault :

User user = db.Users 
       .Where(u => u.UserName.IndexOf(Username, 
        StringComparison.InvariantCultureIgnoreCase) > 0) 
       .FirstOrDefault(); 
+0

@rushonerok - modifié pour correspondre à votre commentaire. –

0

OData contient une fonction substringof. Pour un petit projet sur lequel j'ai travaillé récemment, j'étais préoccupé par le fait qu'il y avait des données 'LIKE' dans trois des propriétés du modèle de données.

$filter=(IN_OUT eq '0' and (substringof('D20033', toupper(BENEFICIARY)) or substringof('D20033', toupper(ORIGINATOR)) or substringof('D20033', toupper(MEMO)))) 

J'ai aussi utilisé la fonction toupper autour des propriétés du modèle en conjonction avec capitalisant la chaîne de recherche sous forme d'entrée de sorte que j'avais une recherche insensible à la casse. Donc, ici, j'étais inquiet à propos de IN_OUT étant '0' et 'D20033' dans un ou plusieurs des trois champs, BENEFICIARY, ORIGINATOR ou MEMO.