2012-01-25 10 views
10

クライアントオブジェクトモデルから取得した結果にLINQを使用しようとしています。クライアントオブジェクトモデルで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クエリから見ることができますが、私は読み込まれていないプロパティを使用していません。

答えて

3

これは私の頭の上から外れていますが、それはあなたに考えを与えるはずです。クエリでAnyを使用したことに関する苦情を受け取ることがあります。その場合は、それを削除し、ExecuteQueryの完了後にhasAdmin.Any()をチェックします。

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 ==フォルダ).First() どうすればよいですか?私はあなたの答えを理解していません。 – kevin

15

私はこの問題に直面しましたが、ここで回答を見つけることができませんでした。 linqクエリが失敗した理由は、クライアントモデルコレクションが複数のイテレータを実装しているためです。あなたのロールアサイメントを列挙しようとすると、IQueryable<T>という拡張メソッドが呼び出されます。このメソッドは、私が想定しているように、いくつかのカプセル化されていないSOAP呼び出しを介してサーバーからデータを取得するように設計されており、クライアントで使用しないでください。私はIEnumerable<T>の拡張メソッドを明示的に使用する必要があります。 だから、これは動作しません。

var hasAdmin = rolesAssignments.Select(predicate); 

そして、これは動作しますが:

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

私はこのプロジェクトを長い間行ってきたので、検証する機会はありません。正直なところ私がやったことを覚えていない。しかし、余分な情報をありがとう。 – ruffen

+2

がきれいです。どうもありがとう!完全に養殖に値する! – Nacht

+1

私たちの問題も解決しました。ありがとう! –

関連する問題