2012-01-25 9 views
10

Я пытаюсь использовать LINQ для результата, полученного из объектной модели клиента.Использование Linq для объекта модели объекта клиента из sharepoint

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: Invalid использование выполнения запроса. Запрос должен быть выполнен с использованием метода ExecuteQuery для объекта контекста клиента.

Однако, когда я переписываю это, чтобы использовать вложенный цикл foreach, он работает нормально.

Из того, что я вижу из моего запроса linq, im не использует какие-либо свойства, которые не загружены.

ответ

3

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

Я также получил сообщение об ошибке, когда я попытался это. var query = folders.Select (f => f.Name == folder) .First() Как я могу попробовать? Я не понимаю вашего ответа. – kevin

15

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

var hasAdmin = rolesAssignments.Select(predicate); 

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

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

Я давно не занимаюсь этим проектом, поэтому у меня нет возможности проверить. Честно говоря, я не могу вспомнить, что я тоже сделал. Спасибо за дополнительную информацию. – ruffen

+2

красивый. большое спасибо! всецело заслуживает безотходности! – Nacht

+1

Исправлена ​​также проблема. Благодаря! –

Смежные вопросы