Question

Je suis un projet convertissait d'utiliser linq2sql d'utiliser une source OData. Je suis en train de rechercher un utilisateur comme celui-ci ...

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 suis l'erreur « « Comme Boolean (System.String, System.String) » La méthode ne peut être utilisée sur le client, il est seulement pour la traduction de SQL. » Cela a été possible en linq2sql donc je me demande comment je changerais cela pour que cela fonctionnerait avec le service OData. Je n'ai trouvé aucun article à ce sujet.

Était-ce utile?

La solution

Comme l'erreur dit SqlMethods.Like () est pour la traduction à SQL. requêtes OData ne sont pas traduites en SQL, de sorte que vous ne pouvez pas utiliser la méthode. Votre meilleur pari est d'utiliser IndexOf avec StringComparison.InvariantCultureIgnoreCase pour émuler un cas de la version insensible 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();

Autres conseils

OData contient une fonction substringof. Pour un petit projet, je travaillais récemment, j'étais inquiet s'il y avait des données « LIKE » une chaîne 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 au sujet IN_OUT être « 0 » et « D20033 » dans un ou plusieurs des trois champs, BÉNÉFICIAIRE, ou qui en a MEMO.

Vous pouvez également utiliser 'startswith' expressions de filtre dans OData.

Exemple:

    var query = context.Users;
    query = query.AddQueryOption("$filter", String.Format("UserName startswith {0}", UserName));
    Users sers = new DataServiceCollection<User>(query);

Cela va générer un URI comme celui-ci: http: // localhost: 7048 / OData / Utilisateurs $ filter = UserName startswith 'Obama'

Référence: https://msdn.microsoft.com/en- nous / bibliothèque / hh169248 (v = nav.80) .aspx

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