2 votes

Le résultat d'OData avec une liste vide (compte zéro) entraîne une erreur.

J'ai mis en œuvre OData pour interroger la liste générée par mon API. Mais parfois, la liste est vide et le résultat OData devrait simplement renvoyer un json vide, mais ce n'est pas le cas. Au lieu de cela, il renvoie l'erreur suivante

La valeur doit être supérieure ou égale à 1. Nom du paramètre : valeur La valeur réelle était de 0.

Voici ma méthode de contrôle

 // Get states by Id
    [HttpGet]
    [ActionName("GetStatesByID")]    
    public ODataResult<DataAccess.Model.State> GetStatesByID(ODataQueryOptions options,int id)
    {

        var states = this.Repository.GetAllStatesByCountry(id).AsQueryable<DataAccess.Model.State>();

        var results = (options.ApplyTo(states) as IQueryable<DataAccess.Model.State>);

        long count = states.Count();

        return new ODataResult<DataAccess.Model.State>(results, null, count);

    }

Je peux mettre le compte à 0 chaque fois que la liste est vide et cela n'entraînera pas d'erreur mais ce n'est vraiment pas une bonne pratique, donc je voulais savoir s'il y a une autre solution pour que ODataResult renvoie un json vide lorsque la liste est vide plutôt que d'entraîner une erreur ?

Gracias

1voto

Tommy Grovnes Points 3063

Je n'ai pas eu l'occasion de le tester puisque je n'ai pas d'environnement actuel, mais faites-en l'essai :

[HttpGet]
[ActionName("GetStatesByID")]    
public ODataResult<DataAccess.Model.State> GetStatesByID(ODataQueryOptions options,int id)
{
    var states = this.Repository.GetAllStatesByCountry(id)
                                .AsQueryable<DataAccess.Model.State>();

    long count = states.Count();

    if(count == 0)
      return null;

    var results = (options.ApplyTo(states) as IQueryable<DataAccess.Model.State>);

    return new ODataResult<DataAccess.Model.State>(results, null, count);
}

Traitez ensuite le résultat vide/nul côté client, ou bien vous pouvez faire >>. este :

Par exemple, lorsque le nombre > 0, il suffit de sérialiser l'ODataResult<> et de le renvoyer en tant que Stream, et lorsque le nombre est égal à 0, vous renvoyez une représentation en chaîne codée en dur de l'ODataResult (avec un nombre égal à zéro), etc. Ce n'est pas aussi joli mais ça pourrait fonctionner.

0voto

RaghuRam Nadiminti Points 3766

Il s'agit d'un bogue dans la classe ODataResult. Le bogue correspondant de codeplex est à http://aspnetwebstack.codeplex.com/workitem/640

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X