2009-12-15 5 views
4

J'utilise ADO.Net Data Services (Astoria) dans Silverlight 3 et je souhaite retarder le chargement des propriétés sur une entité jusqu'à la fin du chargement initial. Cependant, lorsque je suis prêt à les charger, je voudrais regrouper les demandes de chargement ensemble.Charger une propriété dans un lot dans ADO.Net Data Services dans Silverlight

// this is what I want to avoid 
var c = (from c in ctx.Customers.Expand("Address,Phone,Email") 
     where c.Id = 12 
     select c).Take(1) as DataServiceQuery<Customer>; 

Je suis arrivé jusqu'ici:

// I can do this instead 
var c = (from c in ctx.Customers // .Expand("Address,Phone,Email") 
     where c.Id = 12 
     select c).Take(1) as DataServiceQuery<Customer>; 
c.BeginExecute(CustomerCallback, objState); 

... 

// Later, when I want properties, I need to do this 
ctx.BeginLoadProperty(c, "Address", AddressCallback, objState); 
ctx.BeginLoadProperty(c, "Phone", PhoneCallback, objState); 
ctx.BeginLoadProperty(c, "Email", EmailCallback, objState); 

Cependant, je ne peux pas comprendre comment comment obtenir un objet DataServiceRequest pour une demande de propriété de charge pour passer à BeginExecuteBatch. Est-il possible d'émettre ces requêtes (et potentiellement d'autres qui ne sont pas associées au chargement de propriété client) dans le même lot en obtenant une DataServiceQuery?

Quelque chose comme ceci:

// c is the customer from the above load 
ctx.BeginExecuteBatch(BatchCallback, objState, new []{ 
    ctx.GetLoadQuery(c, "Address"), 
    ctx.GetLoadQuery(c, "Phone"), 
    ctx.GetLoadQuery(c, "Email"), 
    GetOtherNonPropertyQuery() 
}); 

Répondre

5

La méthode LoadProperty ne pas utiliser tous les types standard que vous sont disponibles dans dataservice. Cependant le service de données est suffisamment intelligent pour comprendre que

LoadProperty(person, "Gender") 

est le même que

person.Gender = (from g in ent.Person 
       where g.ID == person.ID 
       select g.Gender).FirstOrDefault(); 

Uri généré est le même. Donc, si vous voulez appeler LoadProperty dans une requête par lots, vous pouvez générer assez facilement l'Uri requis. Voir ci-dessous.

public static class DataServiceContextExtensions 
{ 
    public static Uri GetLoadPropertyUri(this DataServiceContext context, object entity, string property) 
    { 
     Uri entityUri = null; 
     if(context.TryGetUri(entity, out entityUri)) 
     { 
      return new Uri(entityUri.AbsoluteUri + "/" + property); 
     } 
     throw new DataServiceClientException("Entity Uri not found."); 
    } 

    public static DataServiceRequest<T> GetLoadPropertyRequest<T>(this DataServiceContext context, object entity, string property) 
    { 
     return new DataServiceRequest<T>(context.GetLoadPropertyUri(entity, property)); 
    } 
} 

Alors maintenant vous pouvez le faire.

ctx.BeginExecuteBatch(BatchCallback, objState, new []{ 
    ctx.GetLoadPropertyRequest<Address>(c, "Address"), 
    ctx.GetLoadPropertyRequest<Phone>(c, "Phone"), 
    ctx.GetLoadPropertyRequest<Email>(c, "Email"), 
    GetOtherNonPropertyQuery() 
}); 

La seule chose qui reste est que cela ne vous revenir à l'objet (s) ce qu'il ne fera pas de lui affecter la valeur de retour (s) à la propriété de l'entité, qui vous devez le faire vous-même sur votre BatchCallback.

Quoi qu'il en soit, Peter Hope vous aide sur ce que vous voulez.

S'il y a quelque chose dont vous avez besoin laissez-moi savoir

Cordialement

Daniel

+0

Merci beaucoup c'est exactement ce que je cherchais. –

+0

pas de soucis je suis heureux je pourrais aider – dmportella

Questions connexes