2010-06-30 7 views
3

Je travaille sur un webpart pour une installation SharePoint 2010. Cela a plusieurs sites, et chaque site a des pages, et peut avoir des sous-sites, eux-mêmes avec plus de pages et de sites. Je veux obtenir une liste de toutes les pages de l'installation qui correspondent à certains critères (par exemple title == "Test").Requête Linq sur tous les sites et sous-sites sur un serveur SharePoint?

Je peux le faire en utilisant un objet CAML SPSiteDataQuery et en définissant la propriété 'Webs' sur <Webs Scope="Recursive" />. Évidemment, cela fait que la requête considère le site actuel et tous les sous-sites. D'autre part, je veux utiliser linq2sp si possible car cela présentera une courbe d'apprentissage plus facile pour les autres développeurs. En utilisant SPMetal, je peux générer un DataContext pour mon site, puis l'interroger avec linq, mais cela n'accède qu'aux pages du site racine.

Existe-t-il un moyen de contrôler la portée d'une requête Linq afin qu'elle fonctionne sur toutes les pages de tous les sites?

grâce, S

+0

C'est une bonne question à laquelle on répond habituellement avec "Utiliser EntityList .ScopeToFolder", ce qui n'a rien à voir avec ce que vous demandez. Difficile de penser qu'ils ont oublié celui-ci. Un simple ajustement dans le fournisseur Linq2SP open source de Codeplex suffisait à ajouter un paramètre de portée. Je dois ... réfléchir ... sur la RTM un peu pour voir ce qui se passe –

Répondre

1

... Une fois la réflexion ... il semble que vous (et nous tous) sont hors de la chance. LINQ to Sharepoint convertit les requêtes en objets SPQuery, qui ne peuvent être utilisés que pour interroger des listes spécifiques. SPSiteDataQuery n'est utilisé nulle part dans l'assembly Microsoft.SharePoint.Linq. Je suppose que vous pourriez parcourir toutes les listes en exécutant la même requête, mais ce serait terriblement inefficace.

Vous pouvez uniquement limiter des listes spécifiques aux dossiers à l'aide de la méthode EntityList< TEntity>.ScopeToFolder.

Une solution de contournement possible est d'utiliser un fournisseur Sharepoint LINQ personnalisé prenant en charge les requêtes inter-sites telles que this one. Je ne l'ai pas utilisé, donc je ne peux pas le garantir.

+0

Blast, je soupçonnais que cela pourrait être la réponse. Actuellement, je suis revenu à l'utilisation de l'approche CAML, mais je soupçonne que cela devra être optimisé agressivement à un moment donné dans le futur. Merci! – Stark

+0

Après la réflexion profonde, je suspecte que L2SP ne prendra pas en charge les requêtes inter-sites de sitôt (c'est-à-dire jusqu'à la prochaine version). Les SPQueries sont utilisées partout pour charger une liste à la fois. Il semble que la logique derrière L2SP soit une liste - une Entité, comme si Sharepoint était une base de données! Changer cela pour prendre en charge les requêtes inter-sites ou les requêtes sur les types de contenu serait un changement trop important pour être déployé dans un Service Pack. Profondément déçu .... –

Questions connexes