Pergunta

Estou trabalhando em um provedor de odados genéricos para ir contra um provedor de dados personalizado que temos aqui. O THSI é totalmente dinâmico, pois consulte o provedor de dados para a tabela que conhece. Até agora, tenho uma estrutura básica de armazenamento com base no código de amostra ODATA.

Meu problema é: o Odata suporta consultas e espera que eu entregue uma implementação iQueryable. No Lowe Rside, eu não tenho nenhum suporte de consulta. Não é uma piada - o provedor retorna tabelas e a cláusula onde não é suportado. O desempenho não é um problema aqui - as tabelas são pequenas. Não há problema em classificá -los no provedor Odata.

Meu principal problema é esse.

  • Enviei uma instrução SQL para obter os dados de uma tabela. O resultado é algum tipo de leitor de dados ADO.NET aqui.
  • Preciso expor uma implementação iQueryable para que esses dados possam permitir a filtragem posterior.

Algum IDE não é melhor tocar isso? .NET 3.5 Somente (sem 4.0 planejado por algum tempo). Eu estava pensando seriamente em criar classes DTO dinâmicas para cada tabela (emitindo bytecode) para que eu possa usar o LINQ padrão. No momento, estou usando um dicionário por entrada (não muito eficiente), mas não vejo maneira real de filtrar / classificar com base nelas.

Foi útil?

Solução

Pablo Castro, uma das principais vozes por trás do Odata diz que a prestação de um serviço ODATA sem a capacidade de consulta é completamente consistente dentro de sua intenção. Ver isto Postagem do blog.

Essa é uma das razões pelas quais eu realmente gostaria que eles implementassem um link de "pesquisa" na resposta do Odata para que um aplicativo cliente pudesse determinar se os recursos de consulta estavam disponíveis ou não. Algo como o OpenSearch.

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

Dessa forma, um cliente pode descobrir facilmente se a pesquisa é implementada ou não.

Outras dicas

Se você está bem em executar a consulta dentro do seu provedor Odata, basta carregar seus dados em uma lista de t (t sendo o tipo de entidade) e depois simplesmente retornar a lista.asqueável (). Isso retornará um LINQ aos objetos consultáveis, que fornecem suporte total para todas as opções de consulta e é baseado no armazenamento na memória (a lista). Observe que, para que isso funcione corretamente, seu IDataServiceQueryProvider.isNullPropagationRequired deve retornar true (pois o LINQ aos objetos exige que os nulos sejam propagados corretamente através da consulta). Além disso, se você definir o CANREFLECTONINSTANCEPROPERTY em qualquer lugar como False, precisará fazer alguma reescrita de consulta. Se for esse o caso, dê uma olhada nesta postagem aqui Para explicar como as propriedades são acessadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top