ID フィルタリングの代替エンティティ 'Contains()' へのリンク
Silverlight ADO.Net Data Services を使用する場合、' が存在しないLinq to Entities の Contains()' は、ID のリストを使用してデータをフィルター処理するときに問題を引き起こします。代わりに、'Any()' を使用することもできます。
<code class="csharp">List<long?> txnIds = new List<long?>(); // Fill list var q = from t in svc.OpenTransaction where txnIds.Any<long>(tt => tt == t.OpenTransactionId) select t;</code>
ただし、この方法では、「メソッド 'Any' はサポートされていません」というエラーが発生します。
回避策カスタム メソッドの使用
この制限を克服するには、カスタム LINQ メソッド 'WhereIn()' を定義できます。
<code class="csharp">public static IQueryable<TEntity> WhereIn<TEntity, TValue> ( this ObjectQuery<TEntity> query, Expression<Func<TEntity, TValue>> selector, IEnumerable<TValue> collection ) { if (selector == null) throw new ArgumentNullException("selector"); if (collection == null) throw new ArgumentNullException("collection"); if (!collection.Any()) return query.Where(t => false); ParameterExpression p = selector.Parameters.Single(); IEnumerable<Expression> equals = collection.Select(value => (Expression)Expression.Equal(selector.Body, Expression.Constant(value, typeof(TValue)))); Expression body = equals.Aggregate((accumulate, equal) => Expression.Or(accumulate, equal)); return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); }</code>
このメソッドはセレクター式とコレクションを受け入れます。比較するための値。一連の等式が生成され、「OR」演算子を使用して結合されます。結果の式はクエリをフィルタリングするために使用されます。
使用法
「WhereIn()」メソッドは次のように使用できます:
<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>
このコードは、「GetContactNames()」コレクション内の名前と一致することによって「連絡先」テーブルをフィルター処理します。
更新 (EF 4 以降)
次のことに注意してください。 Entity Framework バージョン 4 以降では、「Contains()」メソッドが直接サポートされているため、この回避策は廃止されました。
以上が「Contains()」を使用せずに ID のリストを使用して Linq のデータをエンティティにフィルターする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。