在客户端对象模型上使用Linq来自sharepoint

ruf*_*fen 10 c# linq sharepoint-2010

我试图在客户对象模型得到的结果上使用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();
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

但是,当我重写它以使用嵌套的foreach循环时,它工作正常.

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

Tom*_*mmi 15

对不起necroposting,但我刚刚遇到这个问题,但无法在这里找到答案.您的linq查询失败的原因是客户端模型集合实现了多个迭代器.当您尝试枚举您的rolesAssignments时,您会调用IQueryable<T>扩展方法.这个方法(我假设)旨在通过一些封装的soap调用从服务器提取数据,不应该在客户端上使用.你应该明确使用扩展方法IEnumerable<T>.所以,这不起作用:

var hasAdmin = rolesAssignments.Select(predicate);
Run Code Online (Sandbox Code Playgroud)

这将工作:

var hasAdmin = ((IEnumerable<RoleAssignment>)rolesAssignments).Select(predicate);
Run Code Online (Sandbox Code Playgroud)

  • 美丽.非常感谢!完全值得necroposting! (2认同)

Rob*_*sor 3

这不是我的想法,但它应该能给你一个想法。您可能会收到有关在查询中使用 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();
Run Code Online (Sandbox Code Playgroud)