Использование Linq в модели объекта клиента из sharepoint

Я пытаюсь использовать 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, im не использует какие-либо свойства, которые не загружены.

Ответ 1

Это от головы, но это должно дать вам эту идею. Вы можете получить жалобу об использовании Any в запросе. Если так, удалите его, а затем проверьте hasAdmin.Any() после завершения ExecuteQuery.

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

Ответ 2

Извините за некропостинг, но я просто столкнулся с этой проблемой и не смог найти ответ здесь. Причина, по которой ваши запросы linq не удались, - это коллекции клиентских моделей, в которых реализованы несколько итераторов. И когда вы попытаетесь перечислить свои ролиAssignments, вы вызываете методы расширения IQueryable<T>. Эти методы (я предполагаю), предназначенные для вывода данных с сервера через некоторые инкапсулированные мыльные вызовы и не должны использоваться на клиенте. В Istead вы должны явно использовать методы расширения IEnumerable<T>. Итак, это не сработает:

var hasAdmin = rolesAssignments.Select(predicate);

И это будет работать:

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