Использование 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);