Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencipta Dinamik ATAU Pertanyaan dengan LINQ kepada Entiti?

Bagaimanakah Saya Boleh Mencipta Dinamik ATAU Pertanyaan dengan LINQ kepada Entiti?

Barbara Streisand
Barbara Streisandasal
2025-01-22 04:56:13768semak imbas

How Can I Create a Dynamic OR Query with LINQ to Entities?

Bina pertanyaan ATAU dinamik menggunakan LINQ kepada Entiti

Dalam LINQ kepada Entiti, adalah perkara biasa untuk membuat pertanyaan dinamik menggunakan pelaksanaan tertunda. Walau bagaimanapun, pertanyaan ini biasanya menggunakan DAN untuk menyambungkan keadaan WHERE.

Untuk melaksanakan logik ATAU, iaitu mencari berbilang sifat menggunakan pengecam tunggal, anda boleh memanfaatkan PredicateBuilder LINQKit. Ini membolehkan anda membina predikat secara dinamik:

<code class="language-csharp">var query = from u in context.Users select u;
var pred = Predicate.False<user>();

if (type.HasFlag(IdentifierType.Username))
    pred = pred.Or(u => u.Username == identifier);

if (type.HasFlag(IdentifierType.Windows))
    pred = pred.Or(u => u.WindowsUsername == identifier);

return query.Where(pred.Expand()).FirstOrDefault();</code>
Kaedah

Expand() adalah penting kerana Rangka Kerja Entiti tidak dapat mengendalikan ungkapan panggilan. Dengan memanggilnya, anda mengaktifkan kelas pengakses ekspresi LINQKit, yang menggantikan ungkapan ini dengan struktur yang lebih mudah yang difahami oleh Rangka Kerja Entiti.

Tanpa Expand(), ungkapan dipanggil, menghasilkan pengecualian: "Jenis nod ungkapan LINQ 'Invoke' tidak disokong dalam LINQ kepada Entiti

Satu Lagi Pembina Predikat

Kemudian, pembina predikat am telah dibangunkan yang boleh melaksanakan tugas yang sama tanpa Expand():

https://www.php.cn/link/451e10de8e2fb18a9f795679b52dc9f6

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Dinamik ATAU Pertanyaan dengan LINQ kepada Entiti?. 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