10 votes

Utilisation de Linq sur un résultat de modèle objet client à partir de sharepoint

J'essaie d'utiliser LINQ sur un résultat que j'obtiens à partir de Client Object Model.

var rolesAssignments = context.Web.RoleAssignments;
context.Load(rolesAssignments, 
    roles => roles.IncludeWithDefaultProperties(role => role.Member,
    role => role.RoleDefinitionBindings));
context.ExecuteQuery();
var hasAdmin = rolesAssignments.Select(x => x.RoleDefinitionBindings.Cast<RoleDefinition>().Select(y => y.RoleTypeKind == RoleType.Administrator)).Any();

Je reçois :

{System.NotSupportedException : Utilisation non valide de l'exécution de la requête. La requête doit être exécutée en utilisant la méthode ExecuteQuery sur l'objet de contexte du client.

Cependant, lorsque je réécris ceci pour utiliser une boucle foreach imbriquée, cela fonctionne correctement.

D'après ce que je peux voir dans ma requête linq, je n'utilise pas de propriétés qui ne sont pas chargées.

16voto

Tommi Points 1680

Désolé de faire du necroposting, mais je viens d'être confronté à ce problème et je n'ai pas trouvé de réponse ici. La raison pour laquelle vos requêtes linq ont échoué est que les collections du modèle client ont implémenté des itérateurs multiples. Et lorsque vous essayez d'énumérer vos rolesAssignments, vous appelez IQueryable<T> les méthodes d'extension. Ces méthodes (je suppose) sont conçues pour extraire des données du serveur par l'intermédiaire d'appels de savon incapsulés et ne doivent pas être utilisées sur le client. Au lieu de cela, vous devriez utiliser explicitement les méthodes d'extension de IEnumerable<T> . Cela ne fonctionnera donc pas :

var hasAdmin = rolesAssignments.Select(predicate);

Et cela fonctionnera :

var hasAdmin = ((IEnumerable<RoleAssignment>)rolesAssignments).Select(predicate);

3voto

Rob Windsor Points 5009

Cette liste n'est pas exhaustive, mais elle devrait vous donner une idée. Il se peut que l'on vous reproche l'utilisation de "Any" dans la requête. Si c'est le cas, supprimez-la et vérifiez hasAdmin.Any() à la fin de l'exécution de la requête.

var query = rolesAssignments.Select(x => x.RoleDefinitionBindings.Cast<RoleDefinition>().Select(y => y.RoleTypeKind == RoleType.Administrator)).Any();
var hasAdmin = context.LoadQuery(query);
context.ExecuteQuery();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X