J'essaie d'interroger une seule entité dans une base de données avec un DataServiceQuery. L'entité que j'essaie de charger a des relations avec un graphique d'autres entités que je veux charger également. MSDN décrit here et here que je peux charger mes entités référencées en utilisant DataServiceQuery <TElement> .Expand ou DataServiceContext.LoadProperty.Comment charger des relations d'entités du second degré avec un service de données WCF?
Cela fonctionne très bien pour les relations de premier degré de mon entité, mais j'ai un problème pour charger les relations de relations. Il est évident que je pouvais appeler LoadProperty pour toutes les relations de second degré et faire une boucle dans toutes les collections de second degré, mais j'espérais pouvoir charger avec impatience le graphe de relations dans une seule requête. Est-ce possible?
Modifier
chargement En fait, les relations de deuxième degré est pas évident après tout. Le code suivant échoue (modèle de domaine a été modifié pour plus de clarté):
var context = DataServiceReference.DataServiceContextFactory.Create();
var customer = (from c in context.Customers.Expand("Orders")
where c.CustomerId.Equals(customerId)
select c).First();
foreach (var order in customer.Orders)
{
context.LoadProperty(order, "Products");
La dernière ligne jette au-dessus InvalidOperationException: «Le contexte ne poursuit pas actuellement l'entité ». J'utilise des entités d'auto-suivi. Est-ce que cette erreur pourrait être liée à STE?
Comment charger les relations de second degré de quelque façon que ce soit?
Solution modifier
Il se trouve que DataServiceQuery <TElement> .Expand utilise une syntaxe de chemin différent par rapport à ObjectQuery <T> .include. Le premier utilise la barre oblique comme séparateur de trajectoire, le dernier utilise le point. Quelqu'un peut-il expliquer pourquoi la syntaxe est incohérente et où je peux trouver la documentation de la syntaxe du chemin Expand?
Oui, la fabrique de contextes est simplement une classe de fabrique simple qui crée un contexte en utilisant l'URL correcte. Mon problème ici était que le chemin d'expansion utilise "/" Je suis habitué à Inclure qui utilise "." Sur le chemin. Quelle est l'explication de cette notation de chemin incohérente? – Holstebroe
J'ai essayé d'ajouter la ligne context.MergeOption = MergeOption.OverwriteChanges; après avoir créé le contexte et avant de charger les entités, mais LoadProperty échoue toujours et context.GetEntityDescriptor (myEntityInstance) renvoie null. Comment puis-je activer correctement le suivi? – Holstebroe
La syntaxe dans Expand est "héritée" de la syntaxe d'URL de $ expand. Dans l'URL, le/est utilisé pour séparer les navigations, car c'est la manière naturelle de naviguer dans les URL. –