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

时间:2012-01-25 11:26:56

标签: 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();

我明白了:

  

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

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

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

2 个答案:

答案 0 :(得分:15)

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

var hasAdmin = rolesAssignments.Select(predicate);

这将有效:

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

答案 1 :(得分: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();