2014-04-26 6 views
8

मैं वास्तव में नई सी # आधारित एज़ूर मोबाइल सेवाओं के साथ ईंट की दीवार मार रहा हूं, और यह वास्तव में भी आसान है :( मैं अपने जीवन के लिए क्वेरी नहीं प्राप्त कर सकता आपरेशन बच्चे संपत्ति मूल्यों वापस जाने के लिए मैं डिफ़ॉल्ट परियोजना इस तरह संशोधित की कार्यसूची मद है:।Azure मोबाइल सर्विसेज सी # बाल संस्थाओं को वापस नहीं करेगा

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; } 
} 

और फिर मैं TodoItemNumbers वर्ग इस तरह परिभाषित किया है:

public class TodoItemNumbers : EntityData 
{ 
    private int _value; 

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

    public string TodoItemId { get; set; } 
} 

TodoItemController मैं में क्वेरी से मुलाकात की है इस

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

फिडलर के साथ अनुरोध करते समय इनमें से कोई भी नंबर संपत्ति वापस नहीं करेगा। पागलपन के एक पल में मैं भी नियंत्रक के प्रारंभ विधि संशोधित इस शामिल करने के लिए:

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); 
} 

नोट आलसी लोड हो रहा है और प्रॉक्सी निर्माण किया है दोनों बंद कर दिया गया। क्या कोई इस साधारण परिदृश्य को हरा करने के बारे में जानता है? मैं इस पर अच्छे वाइब्स महसूस नहीं कर रहा हूं।

अद्यतन इसलिए जैसा कि मैंने नीचे दिया है, मैं क्वेरी में $ विस्तार में डेटा जोड़कर डेटा वापस करने में सक्षम था। अब हालांकि मैं क्लाइंट को उस पैरामीटर को अनुरोध में जोड़ने के लिए वास्तव में अटक गया हूं। यह हमेशा आधार डेटा लौट रहा है।

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

बच्चे गुण नहीं लौटेगा, और वहाँ परिणाम प्रकार

+0

यदि आप संग्रह संपत्ति से 'आभासी' ड्रॉप करते हैं तो यह आलसी लोड का उपयोग नहीं करेगा (यह हमारे प्रश्न का उत्तर नहीं देता है लेकिन जानना अच्छा हो सकता है) – BrunoLM

उत्तर

2

मेरे गलती वास्तव में समीकरण में OData हिस्सा डाल नहीं किया गया था पर एक को शामिल करें विकल्प नहीं है। जैसे ही मैंने

http://localhost:51025/tables/todoitem 

के बजाय

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

पूछे यह जादुई दिखाई दिया। अब मैं क्लाइंट एपीआई में आने के लिए कैसे प्राप्त करूं ...? अद्यतन मैं इस कोड

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

साथ ग्राहक के पक्ष में यह कामयाब रहे लेकिन उसके बाद एक बेहतर तरीका

0

होने के लिए मैंने सोचा कि यह .Include (x => x.Numbers) था वहाँ है gettable

+0

नहीं, मेरे पास मेरे कोड में यही है। मैंने सोचा कि भी काम करना चाहिए। – Dylan

0

विस्तारित सहायता का उपयोग करके मुझे एक ही समस्या & थी। फिर एक @carlosfigueira यहाँ इस परिदृश्य से निपटने

How do we load related objects (Eager Loading) in Dot Net based Azure Mobile Service?

कृपया एक नजर है की एक बेहतर तरीका का सुझाव दिया। इस मुद्दे से निपटने के लिए अब तक का सबसे अच्छा तरीका है। Supreet

2

यह भी ग्राहक पर कोई हैंडलर जोड़कर इसे प्राप्त करने के लिए संभव है:

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); 
    } 
} 

उपयोग:

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

के बजाय Query विधि अधिभावी, GetAllTodoItems विधि की तरह लग रही है यह:

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

यह $expand हैक का एक विकल्प है। मैंने अपने लिए Azure ऐप सेवा मोबाइल ऐप की खोज करते समय इसकी खोज की। Include पर चेनिंग, जैसा कि आपने मूल रूप से प्रयास किया था, अकेले कॉल करें, अगर यह काम करता है तो मुझे अधिक समझदारी होगी। इसके बाद, मैं यह जानना चाहता हूं कि यह क्यों काम नहीं करता है।

संबंधित मुद्दे