ホームページ >バックエンド開発 >C++ >「Contains()」を使用せずに ID のリストを使用して Linq のデータをエンティティにフィルターする方法

「Contains()」を使用せずに ID のリストを使用して Linq のデータをエンティティにフィルターする方法

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 18:08:06937ブラウズ

How to Filter Data in Linq to Entities Using a List of IDs Without 'Contains()'?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。