Pergunta

Estou tentando criar uma chamada para o Odata Web Service que selecionaria apenas valores distintos de alguma propriedade. Existe algum bom exemplo de como fazer isso?

Foi útil?

Solução

Atualmente, o protocolo ODATA não suporta o operador distinto, ou qualquer outro operador que ajudasse com essa consulta (supondo que você esteja procurando valores discitintos de uma propriedade primitiva em alguma entidade). Você deve poder alternar isso implementando uma operação de serviço no servidor que executa essa consulta no provedor subjacente que geralmente possui essa habilidade. E então o cliente pode chamar essa operação de serviço.

Outras dicas

Observação: Eu sei que isso é antigo, mas ainda aparece nas respostas de pesquisa. Agora existe uma boa solução para esse problema.

Em Odata v4, há apoio para $ Aplicar, entre outras coisas, $apply pode ser usado para retornar um conjunto distinto de campos de um conjunto de resultados.

Veja discussão relacionada: Aplicando distinto ao odataquery

de Odata v4 espec,
A opção de consulta $apply Tome uma sequência de transformações de conjunto, separadas por barras para frente para expressar que elas são aplicadas consecutivamente, por exemplo, o resultado de cada transformação é a entrada para a próxima transformação $ aplicativo é uma função que requer

tl; dr;
Basicamente, se eu tiver uma tabela que tenha muitos campos, mas quero devolver apenas os registros distintos de vários campos específicos. O primeiro passo é identificar as colunas distintas, vamos chamá -los Name e Id.
Basta usar o $apply função para obter um conjunto de resultados distintos contendo apenas os nomes e colunas de identificação com sintaxe como esta:

http://url.to/tableresource?$apply=groupby((Name,Id))

Vamos fazer isso por exemplo, TuberInspections tem 1000s de linhas, mas apenas alguns contratados, quero exibir os nomes dos contratados em uma lista suspensa para usar em uma consulta de filtragem.

Minhas colunas distintas são ContractorName e ContractorId

GET /odata/TuberInspections?$apply=groupby((ContractorName,ContractorId)) HTTP/1.1
Host: localhost:1230

Response:
    { 
        "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(ContractorName,ContractorId)",
        "value": [
            {
                "@odata.id": null,
                "ContractorId": 11534,
                "ContractorName": "Kermit d'Frog"
            },
            {
                "@odata.id": null,
                "ContractorId": 11539,
                "ContractorName": "Carlos Spicy Wiener"
            },
            {
                "@odata.id": null,
                "ContractorId": 16827,
                "ContractorName": "Jen Gelfling"
            }
        ]
    }

Se sua estrutura de dados não for plana o suficiente, haverá suporte limitado de OOTB para recuperar estruturas simples de resultados aninhados.

Se a estrutura de dados dele é difícil de consumir e você tiver controle sobre a API, considere criar uma função personalizada para retornar o conjunto de registros específico que você deseja, esse é o exercício trivial que tem muitas opções diferentes disponíveis, mas fora do escopo dessa resposta.

Essa resposta é direcionada para como consultar um serviço OData existente para valores distintos, não como modificar um serviço para fornecer essas informações.

Atualmente, apenas um único caminho de navegação é suportado com a seguinte sintaxe. A consulta acima também pode ser escrita como:

GET /odata/TuberInspections?$apply=groupby((Contractor/EntityID,Contractor/Initials))
Host: localhost:1230

Response:
    { 
         "@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(Contractor(EntityID,Initials))",
         "@odata.count": 3,
         "value": [
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "KdF",
                     "EntityID": 11534
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "SW",
                     "EntityID": 11539
                 }
             },
             {
                 "@odata.id": null,
                 "Contractor": {
                     "@odata.id": null,
                     "Initials": "Jen",
                     "EntityID": 16827
                 }
             }
         ]
    } 

Existem variações mais avançadas (complicadas) para aninhados ou empilhados $apply Transformações que incluem retornar uma contagem do número de linhas exclusivas que correspondem a cada um dos resultados distintos.

Para mais informações, poste perguntas específicas e etiqueta com ODATA-V4 e você encontrará toda a ajuda que precisa :)

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