Использование Linq на объектной модели клиента, полученной из sharepoint - PullRequest
10 голосов
/ 25 января 2012

Я пытаюсь использовать 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 ]

15 голосов
/ 05 апреля 2013

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

var hasAdmin = rolesAssignments.Select(predicate);

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

var hasAdmin = ((IEnumerable<RoleAssignment>)rolesAssignments).Select(predicate);
3 голосов
/ 27 января 2012

Это не в моей голове, но это должно дать вам идею.Вы можете получить жалобу на использование 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...