2017-10-18 18 views
2

J'utilise Core .NET 2.0.0 avec https://www.nuget.org/packages/microsoft.aspnetcore.odataOData dans .NET Web Core API pour sérialisation List/Dictionnaire

Ceci est ma configuration jusqu'à présent.

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddOData(); 
    services.AddSingleton<IODataModelManger, ODataModelManager>(DefineEdmModel); 
    ... 
} 

private ODataModelManager DefineEdmModel(IServiceProvider services) 
{ 
    var modelManager = new ODataModelManager(); 

    var builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<TestDTO>(nameof(TestDTO)); 
    builder.EntityType<TestDTO>().HasKey(ai => ai.Id); // the call to HasKey is mandatory 
    modelManager.AddModel(nameof(Something), builder.GetEdmModel()); 

    return modelManager; 
} 

public void Configure(...) 
{ 
    ... 
    var modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<TestDTO>("TestDTOs"); 

    app.UseMvc(builder => 
    { 
     builder.MapODataRoute("api", modelBuilder.GetEdmModel()); 
    }); 
    ... 
} 

Contrôleur

[HttpGet("all")] 
public async Task<IQueryable<TestDTO>> Get() 
{ 
    // plug your entities source (database or whatever) 
    var test = await TestService.GetTest(); 

    var modelManager = (IODataModelManger)HttpContext.RequestServices.GetService(typeof(IODataModelManger)); 
    var model = modelManager.GetModel(nameof(Something)); 
    var queryContext = new ODataQueryContext(model, typeof(TestDTO), null); 
    var queryOptions = new ODataQueryOptions(queryContext, HttpContext.Request, Provider); 

    return queryOptions 
     .ApplyTo(test, new ODataQuerySettings 
     { 
      HandleNullPropagation = HandleNullPropagationOption.True 
     }, null) 
     .Cast<TestDTO>(); 
} 

Modèle

public class TestDTO : BaseEntityDTO 
{ 
    [Required] 
    public Guid Id { get; set; } 
    public List<CustomerDTO> Customers { get; set; } 
    public List<string> Tags { get; set; } 
    [JsonExtensionData] 
    public IDictionary<string, object> AddProperties { get; set; } 
} 

Le problème est que services.AddOData(); je reçois seulement des résultats de retour avec l'identification de propriété, sans services.AddOData(); j'obtiens toutes les propriétés json formatées.

Comment est-ce que je sérialise également les propriétés de liste et peut-être aussi le dictionnaire?

Merci.

+1

Je poser votre question à https://github.com/joshcomley/Microsoft.AspNetCore.OData/issues/2 –

+0

@SamXu merci :) bon monsieur –

Répondre

0

Ce fait le tour

var result = queryOptions 
         .ApplyTo(test, new ODataQuerySettings 
         { 
          HandleNullPropagation = 
          HandleNullPropagationOption.True 
          }, null) 
          .Cast<TestDTO>(); 
return Json(result);