Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menapis Data dalam Linq kepada Entiti Menggunakan Senarai ID Tanpa \'Mengandungi()\'?

Bagaimana untuk Menapis Data dalam Linq kepada Entiti Menggunakan Senarai ID Tanpa \'Mengandungi()\'?

Susan Sarandon
Susan Sarandonasal
2024-10-29 18:08:06936semak imbas

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

Linq kepada Entiti 'Mengandungi()' Alternatif untuk Penapisan ID

Dalam bekerja dengan Silverlight ADO.Net Data Services, ketiadaan ' Mengandungi()' dalam Linq kepada Entiti menimbulkan cabaran apabila menapis data menggunakan senarai ID. Sebagai alternatif, 'Any()' boleh digunakan:

<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>

Walau bagaimanapun, pendekatan ini menghasilkan ralat "Kaedah 'Mana-mana' tidak disokong".

Penyelesaian menggunakan Kaedah Tersuai

Untuk mengatasi had ini, kaedah LINQ tersuai, 'WhereIn()', boleh ditakrifkan:

<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>

Kaedah ini menerima ungkapan pemilih dan koleksi nilai untuk perbandingan. Ia menjana satu siri ungkapan kesamaan yang kemudiannya digabungkan menggunakan pengendali 'ATAU'. Ungkapan yang terhasil digunakan untuk menapis pertanyaan.

Penggunaan

Kaedah 'WhereIn()' boleh digunakan seperti berikut:

<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>

Kod ini menapis jadual 'Kenalan' dengan memadankan nama dalam koleksi 'GetContactNames()'.

Kemas kini (EF 4 dan Kemudian)

Perlu diperhatikan bahawa Rangka Kerja Entiti versi 4 dan kemudian menyokong secara langsung kaedah 'Mengandungi()', menjadikan penyelesaian ini usang.

Atas ialah kandungan terperinci Bagaimana untuk Menapis Data dalam Linq kepada Entiti Menggunakan Senarai ID Tanpa \'Mengandungi()\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn