Membina LINQ Dinamik kepada Pertanyaan Entiti dengan Syarat ATAU
Mencipta pertanyaan LINQ dinamik selalunya memerlukan gabungan berbilang klausa WHERE. Walaupun LINQ standard dengan mudah mengendalikan keadaan DAN, membina keadaan OR dinamik memberikan cabaran. Artikel ini menunjukkan penyelesaian menggunakan PredicateBuilder
LINQKit untuk mencapai ini.
Kuncinya ialah memanfaatkan PredicateBuilder
untuk penciptaan predikat yang fleksibel dan memastikan keserasian dengan Rangka Kerja Entiti. Kod berikut menunjukkan pendekatan ini:
<code class="language-csharp">var query = from u in context.Users select u; var pred = PredicateBuilder.False<User>(); // Start with a predicate that's always false if (type.HasFlag(IdentifierType.Username)) pred = pred.Or(u => u.Username == identifier); if (type.HasFlag(IdentifierType.Windows)) pred = pred.Or(u => u.WindowsUsername == identifier); // Corrected parenthesis return query.Where(pred.Expand()).FirstOrDefault(); // or return query.AsExpandable().Where(pred).FirstOrDefault();</code>
Yang penting, perhatikan penggunaan pred.Expand()
atau query.AsExpandable()
. Ini penting kerana PredicateBuilder
mencipta ungkapan yang tidak disokong secara langsung oleh Rangka Kerja Entiti. Expand()
(atau AsExpandable()
) menggunakan pelawat ekspresi LINQKit untuk menterjemah ungkapan ini ke dalam bentuk yang serasi dengan Rangka Kerja Entiti, menghalang pengecualian.
Sebagai alternatif, pertimbangkan untuk meneroka pelaksanaan PredicateBuilder
lain, seperti yang dilakukan oleh Peter Montgomery (https://www.php.cn/link/451e10de8e2fb18a9f795679b52dc9f6), tanpa yang mungkin menawarkan kefungsian yang serupa memerlukan panggilan Expand()
eksplisit. Ini menyediakan pendekatan yang diperkemas untuk membina keadaan OR dinamik dalam LINQ anda kepada pertanyaan Entiti.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan OR Logik untuk Menggabungkan Klausa WHERE dalam LINQ Dinamik kepada Pertanyaan Entiti?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!