Di T-SQL Anda bisa memiliki pertanyaan seperti:
SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")
Bagaimana Anda mereplikasi itu dalam permintaan LINQ ke Entitas? Apakah itu mungkin?
sumber
Di T-SQL Anda bisa memiliki pertanyaan seperti:
SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")
Bagaimana Anda mereplikasi itu dalam permintaan LINQ ke Entitas? Apakah itu mungkin?
Anda harus mengaktifkannya sesuai dengan cara Anda memikirkannya. Alih-alih melakukan "dalam" untuk menemukan hak pengguna item saat ini di set yang telah ditentukan sebelumnya dari hak pengguna yang berlaku, Anda meminta seperangkat hak pengguna yang telah ditentukan sebelumnya jika mengandung nilai yang berlaku item saat ini. Ini persis cara yang sama Anda akan menemukan item dalam daftar reguler di .NET.
Ada dua cara untuk melakukan ini menggunakan LINQ, satu menggunakan sintaks kueri dan yang lainnya menggunakan sintaks metode. Pada dasarnya, keduanya sama dan dapat digunakan bergantian tergantung pada preferensi Anda:
Sintaks Kueri:
var selected = from u in users
where new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights)
select u
foreach(user u in selected)
{
//Do your stuff on each selected user;
}
Sintaks Metode:
var selected = users.Where(u => new[] { "Admin", "User", "Limited" }.Contains(u.User_Rights));
foreach(user u in selected)
{
//Do stuff on each selected user;
}
Preferensi pribadi saya dalam contoh ini mungkin sintaksis metode karena alih-alih menetapkan variabel, saya bisa melakukan foreach melalui panggilan anonim seperti ini:
foreach(User u in users.Where(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights)))
{
//Do stuff on each selected user;
}
Secara sintaksis ini terlihat lebih rumit, dan Anda harus memahami konsep ekspresi lambda atau delegasi untuk benar-benar mengetahui apa yang terjadi, tetapi seperti yang Anda lihat, ini memadatkan kode dalam jumlah yang wajar.
Semuanya bermuara pada gaya dan preferensi pengkodean Anda - ketiga contoh saya melakukan hal yang sama sedikit berbeda.
Cara alternatif bahkan tidak menggunakan LINQ, Anda dapat menggunakan sintaks metode yang sama menggantikan "di mana" dengan "FindAll" dan mendapatkan hasil yang sama, yang juga akan bekerja di .NET 2.0:
foreach(User u in users.FindAll(u => new [] { "Admin", "User", "Limited" }.Contains(u.User_Rights)))
{
//Do stuff on each selected user;
}
Ini harus mencukupi tujuan Anda. Ini membandingkan dua koleksi dan memeriksa apakah satu koleksi memiliki nilai yang cocok dengan koleksi lainnya
sumber
Jika Anda menggunakan VS2008 / .net 3.5, lihat tip Alex James # 8: http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style -queries-using-linq-to-entitas.aspx
Kalau tidak, cukup gunakan metode array.Contains (someEntity.Member).
sumber
Saya akan mengikuti Inner Join dalam konteks ini. Jika saya akan menggunakan isi, itu akan berulang 6 kali meskipun jika fakta bahwa hanya ada satu pertandingan.
Kekurangan dari Contains
Misalkan saya memiliki dua objek daftar.
Menggunakan Contains, itu akan mencari setiap item Daftar 1 dalam Daftar 2 yang berarti iterasi akan terjadi 49 kali !!!
sumber
Ini bisa menjadi cara yang memungkinkan Anda dapat secara langsung menggunakan metode ekstensi LINQ untuk memeriksa klausa in
sumber
Saya juga mencoba untuk bekerja dengan SQL-IN-like hal - permintaan terhadap Model Data Entitas . Pendekatan saya adalah pembangun string untuk menyusun ekspresi OR besar. Itu sangat jelek, tapi aku khawatir itu satu-satunya cara untuk pergi sekarang.
Nah, itu terlihat seperti ini:
Bekerja dengan GUID dalam konteks ini : Seperti yang Anda lihat di atas, selalu ada kata "GUID" di depan GUID jika ada dalam fragmen string kueri. Jika Anda tidak menambahkan ini,
ObjectQuery<T>.Where
berikan pengecualian berikut:Menemukan ini di Forum MSDN, mungkin bermanfaat untuk diingat.
Matthias
... menantikan versi .NET dan Entity Framework berikutnya, ketika semuanya menjadi lebih baik. :)
sumber
Metode alternatif untuk jawaban BenAlabaster
Pertama-tama, Anda dapat menulis ulang kueri seperti ini:
Tentu saja ini lebih 'bertele-tele' dan menyusahkan untuk ditulis tetapi berfungsi semua sama.
Jadi jika kita memiliki beberapa metode utilitas yang membuatnya mudah untuk membuat ekspresi LINQ semacam ini, kita akan berada dalam bisnis.
dengan metode utilitas di tempat Anda dapat menulis sesuatu seperti ini:
Ini membangun ekspresi yang memiliki efek yang sama dengan:
Tetapi yang lebih penting sebenarnya bekerja melawan .NET 3.5 SP1.
Berikut adalah fungsi plumbing yang memungkinkan ini:
Saya tidak akan mencoba menjelaskan metode ini, selain mengatakan itu pada dasarnya membangun ekspresi predikat untuk semua nilai menggunakan valueSelector (yaitu p => p.User_Rights) dan ATAU predikat itu bersama-sama untuk membuat ekspresi untuk lengkap predikat
Sumber: http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx
sumber
Contoh nyata:
sumber
Serius? Kalian tidak pernah menggunakan
sumber
Checks = NumValues * NumRows
. Karena ini adalah perhitungan tipe M * N, jika salah satu kecil, maka waktu untuk melakukan setiap pemeriksaan yang diperlukan juga akan kecil. Saya menambahkan kendala sehingga cjm30305 akan tahu cara mengatur lingkungan pengujian di mana menunjukkan mengapa solusinya buruk.where new[] { 1, 2, 3 }.Contains(x)
perbandingannya kurangwhere (x == 1 || x == 2 || x == 3)
?