在客户端对象模型上使用Linq会从sharepoint得到结果

本文关键字:sharepoint 会从 结果 Linq 客户端 对象模型 | 更新日期: 2023-09-27 18:21:17

我正试图对从客户端对象模型得到的结果使用LINQ。

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

我得到:

{System.NotSupportedException:查询执行的用法无效。应在客户端上下文对象上使用ExecuteQuery方法执行查询。

然而,当我重写它以使用嵌套的foreach循环时,它工作得很好。

从我的linq查询中可以看出,我没有使用任何未加载的属性。

在客户端对象模型上使用Linq会从sharepoint得到结果

很抱歉发布死讯,但我刚刚遇到这个问题,无法在这里找到答案。linq查询失败的原因是客户端模型集合实现了多个迭代器。当你尝试枚举你的角色分配时,你会调用IQueryable<T>扩展方法。这种方法(我认为)旨在通过一些封装的soap调用从服务器中提取数据,不应在客户端上使用。因此,您应该显式地使用IEnumerable<T>的扩展方法。因此,这将不起作用:

var hasAdmin = rolesAssignments.Select(predicate);

这将起作用:

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

这是我想不通的,但它应该会给你一个想法。您可能会收到关于在查询中使用Any的投诉。如果是,请删除它,然后在ExecuteQuery完成后检查hasAdmin.Any()。

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