我试图在客户对象模型得到的结果上使用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查询中可以看到,我没有使用任何未加载的属性。
答案 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();