2012-01-25 10 views
10

Próbuję użyć LINQ na wynik otrzymuję od modelu obiektu klienta.Korzystanie z Linq na modelu obiektu klienta wynik z 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(); 

uzyskać:

{System.NotSupportedException: Nieprawidłowe wykorzystanie wykonania kwerendy. Zapytanie powinno zostać wykonane przy użyciu metody ExecuteQuery w obiekcie kontekstu klienta.

Jednak, gdy przepisuję to, aby użyć zagnieżdżonej pętli foreach, działa dobrze.

Z tego, co widzę w moim zapytaniu linq, nie używam żadnych właściwości, które nie zostały załadowane.

Odpowiedz

3

To z mojej głowy, ale powinien dać ci pomysł. Możesz otrzymać skargę dotyczącą użycia Any w zapytaniu. Jeśli tak, usuń go, a następnie sprawdź hasAdmin.Any() po zakończeniu 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

Dostałam też błąd, gdy próbowałem to. var query = folders.Select (f => f.Name == folder) .First() Jak powinienem spróbować? Nie rozumiem twojej odpowiedzi. – kevin

15

Przepraszamy za nekropasting, ale właśnie stanąłem w obliczu tego problemu i nie byłem w stanie znaleźć odpowiedzi tutaj. Powodem, dla którego kwerendy linq nie powiodły się, kolekcje modelu klienta zaimplementowano wiele iteratorów. A kiedy spróbujesz wyliczyć swoje roleAssignments, które wywołasz IQueryable<T> metody rozszerzeń. Ta metoda (zakładam) została zaprojektowana w celu pobierania danych z serwera za pośrednictwem wywoływanych wywołań mydła i nie powinna być używana na kliencie. Zamiast tego należy wyraźnie użyć metod rozszerzeń o numerze IEnumerable<T>. Tak, to nie będzie działać:

var hasAdmin = rolesAssignments.Select(predicate); 

A to będzie działać:

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

Nie korzystam z tego projektu przez długi czas, więc nie mam możliwości weryfikacji. Szczerze mówiąc nie mogę sobie przypomnieć, co też robiłem. Dzięki za dodatkowe informacje. – ruffen

+2

piękne. Wielkie dzięki! całkowicie warte nekropostacji! – Nacht

+1

Naprawiono również nasz problem. Dzięki! –

Powiązane problemy