2014-04-26 7 views
8

Ich treffe wirklich eine Mauer mit den neuen C# basierten Azure Mobile Services, und es ist auch wirklich einfach :( Ich kann nicht für das Leben von mir die Abfrage bekommen Betrieb zurückzukehren Kind Eigenschaftswerte ich habe die todo Artikel des Standard-Projekt wie dieses geändert:.Azure Mobile Services C# gibt keine untergeordneten Elemente zurück

public class TodoItem : EntityData 
{ 
    public TodoItem() 
    { 
     this.Numbers = new Collection<TodoItemNumbers>(new List<TodoItemNumbers> 
     { 
      new TodoItemNumbers{Value = 1}, 
      new TodoItemNumbers{Value = 2}, 
      new TodoItemNumbers{Value = 3}, 
      new TodoItemNumbers{Value = 4}, 
      new TodoItemNumbers{Value = 5}, 
     }); 
    } 
    public virtual ICollection<TodoItemNumbers> Numbers { get; set; } 
    public string Text { get; set; } 
    public bool Complete { get; set; } 
} 

Und dann habe ich die TodoItemNumbers Klasse definiert wie folgt aus:

public class TodoItemNumbers : EntityData 
{ 
    private int _value; 

    public int Value 
    { 
     get { return _value; } 
     set 
     { 
      _value = value; 
      Id = value.ToString(); 
     } 
    } 

    public string TodoItemId { get; set; } 
} 

im TodoItemController I habe die Query übersteuert hod wie diese

protected override IQueryable<TodoItem> Query() 
{ 
    return base.Query().Include(x => x.Numbers); 
} 

Nichts davon die Zahlen Eigenschaft wird zurückkehren, wenn ich eine Anfrage mit Fiddler machen. In einem Moment der madness I modifiziert auch die Initialize-Methode der Steuerung dieses umfassen:

protected override void Initialize(HttpControllerContext controllerContext) 
{ 
    base.Initialize(controllerContext); 
    myContext context = new myContext(); 
    context.Configuration.LazyLoadingEnabled = false; 
    context.Configuration.ProxyCreationEnabled = false; 
    DomainManager = new EntityDomainManager<TodoItem>(context, Request, Services); 
} 

Notiere die träges Laden und Proxy Schaffung haben beide ausgeschaltet sind. Kann jemand dieses einfache Szenario schlagen? Ich fühle nicht die gute Stimmung auf diesem einen.

Update So, wie ich unten beantwortet habe ich in der Lage, den Service zu bekommen, um die Daten durch Hinzufügen in der $ erweitern, um die Abfrage zurückzukehren. Nun aber bin ich wirklich darauf angewiesen, dass der Client diesen Parameter zur Anfrage hinzufügt. Es gibt immer nur die Basisdaten zurück.

var data = await App.MobileService.GetTable<TodoItem>() 
     .ToListAsync(); 

werden die untergeordneten Eigenschaften nicht zurück, und es gibt nicht eine Include-Option auf dem Ergebnistyp

+0

Wenn Sie das 'virtual' aus der collection -Eigenschaft löschen, wird es keine Lazy Load verwenden (das beantwortet unsere Frage nicht, aber es ist nett zu wissen) – BrunoLM

Antwort

2

Mein Fehler war nicht wirklich das OData Teil in die Gleichung setzen. Sobald ich

abgefragt
http://localhost:51025/tables/todoitem?$expand=Numbers 

statt

http://localhost:51025/tables/todoitem 

Es schien magisch. Wie bekomme ich das in der Client-API ...? aktualisieren Ich schaffte es auf der Clientseite mit diesem Code

var json = 
        await 
         App.MobileService.GetTable("TodoItem") 
          .ReadAsync("$expand=Numbers"); 
JsonConvert.DeserializeObject<TodoItem>(json.First.ToString()); 

Aber es hat

0

ich einen besseren Weg zu sein, dachte, es war .INCLUDE (x => x.Numbers) nach dem GetTable

+0

Nein, das ist, was ich in meinem Code habe. Ich dachte, das sollte auch funktionieren. – Dylan

2

Es ist auch möglich, es zu erreichen durch einen Handler auf dem Client hinzufügen:

var client = new MobileServiceClient("http://xxxxxx/", null, new ODataParameterHandler()); 

public class ODataParameterHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     UriBuilder builder = new UriBuilder(request.RequestUri); 

     builder.Query = builder.Query 
      .Replace("expand", "$expand") 
      .TrimStart('?'); 

     request.RequestUri = builder.Uri; 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 

Verbrauch:

var test = await client.GetTable<TodoItem>() 
    .WithParameters(new Dictionary<string, string> { { "expand", "Something" } }) 
    .ToListAsync(); 
1

Statt das Überschreiben der Query Methode haben die GetAllTodoItems Methode aussehen dies:

public IList<TodoItem> GetAllTodoItems() 
{ 
    return context.TodoItems.Include("Numbers").ToList(); 
} 

Dies ist eine Alternative zum $expand Hack. Ich habe es entdeckt, als ich die Apps von Azure App Service für mich selbst erkundete. Verkettung auf einem Include Aufruf allein, wie Sie ursprünglich versuchten, würde mehr Sinn für mich, wenn es funktioniert. Als nächstes möchte ich herausfinden, warum das nicht funktioniert.