Question

Je travaille sur un fournisseur de OData générique pour aller à l'encontre d'un fournisseur de données personnalisées que nous avons ici. Thsi est entièrement dynamique que je questionne le fournisseur de données pour la table, il sait. J'ai une structure de stockage de base en place jusqu'à présent sur la base du code exemple OData.

Mon problème est: OData supporte les requêtes et me attend à la main dans une mise en œuvre IQueryable. Sur le rside lowe, je n'ai pas de soutien de la requête. Pas une blague - le fournisseur renvoie les tables et la clause WHERE est pas pris en charge. La performance est pas un problème ici - les tables sont petites. Il est autorisé à les trier dans le fournisseur OData.

Mon principal problème est la suivante.

  • Je soumets une instruction SQL pour obtenir les données d'une table. Le résultat est une sorte de lecteur de données ADO.NET ici.
  • je dois exposer une mise en œuvre IQueryable pour ces données pour permettre le filtrage potentiellement plus tard.

Tous ahow au mieux ide tactile? .NET 3.5 uniquement (pas de 4.0 prévu pour un certain temps). Je pensais sérieusement à la création de classes DTO dynamiques pour toutes les tables (bytecode émettant) afin que je puisse utiliser LINQ standard. En ce moment je suis en utilisant un dictionnaire par entrée (pas trop efficace) mais je ne vois aucun moyen de filtrer / trier basée sur eux.

Était-ce utile?

La solution

Pablo Castro, l'une des principales voix derrière OData dit que la prestation d'un service OData sans la capacité d'interrogation est complètement à l'intérieur est conforme à leur intention. Voir ce blog.

Ceci est l'une des raisons pour lesquelles je souhaite vraiment qu'ils appliqueraient un lien « recherche » dans la réponse OData de sorte qu'une application cliente pourrait déterminer si les capacités étaient disponibles ou l'interrogation non. Quelque chose comme OpenSearch.

<Link rel="search" type="application/ODataQuery+xml" href="QueryMetadata.xml"/>

De cette façon, un client peut facilement découvrir si la recherche est mise en œuvre ou non.

Autres conseils

Si vous êtes OK avec l'exécution de la requête à l'intérieur de votre fournisseur OData, vous pouvez simplement charger vos données dans une liste de T (T étant le type de l'entité), puis il suffit de retourner list.AsQueryable (). Cela renverra un LINQ to Objects interrogeable qui fournit un support complet pour toutes les options de requête et est basée sur le stockage en mémoire (la liste). Notez que pour que cela fonctionne correctement votre IDataServiceQueryProvider.IsNullPropagationRequired doit retourner true (comme LINQ to Objects nécessite nulls être correctement propagées à travers la requête). Aussi, si vous définissez CanReflectOnInstanceProperty où false, vous devez faire une réécriture de la requête. Si tel est le cas jeter un oeil à ce poste ici pour des explications sur la façon dont les propriétés sont accessibles.

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