Saya punya satu pertanyaan besar.
Saya mendapat kueri linq untuk membuatnya terlihat seperti ini:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Nilai dari string[]
array akan menjadi angka seperti (1,45,20,10, dll ...)
Default untuk .Contains
adalah .Contains(string)
.
Saya membutuhkannya untuk melakukan ini sebagai gantinya: .Contains(string[])
...
EDIT: Satu pengguna menyarankan untuk menulis kelas ekstensi untuk string[]
. Saya ingin mempelajari caranya, tetapi ada yang mau mengarahkan saya ke arah yang benar?
EDIT: UID juga akan menjadi angka. Itu sebabnya diubah menjadi string.
Membantu siapa saja?
Jawaban:
spoulson hampir benar, tetapi Anda harus membuat
List<string>
daristring[]
pertama. SebenarnyaList<int>
akan lebih baik jika uid jugaint
.List<T>
mendukungContains()
. Melakukanuid.ToString().Contains(string[])
akan menyiratkan bahwa uid sebagai string berisi semua nilai dari array sebagai substring ??? Bahkan jika Anda benar-benar menulis metode ekstensi, pengertiannya akan salah.[EDIT]
Kecuali jika Anda mengubahnya dan menulisnya
string[]
seperti yang diperlihatkan Mitch Wheat, Anda hanya dapat melewati langkah konversi.[ENDEDIT]
Inilah yang Anda inginkan, jika Anda tidak melakukan metode ekstensi (kecuali Anda sudah memiliki kumpulan uids potensial sebagai int - maka gunakan
List<int>()
saja). Ini menggunakan sintaks metode berantai, yang menurut saya lebih bersih, dan melakukan konversi ke int untuk memastikan bahwa kueri dapat digunakan dengan lebih banyak penyedia.sumber
List<int>
gantinya dan melewatkanToString
panggilan.Jika Anda benar-benar ingin mereplikasi Contains , tetapi untuk sebuah array, berikut adalah metode ekstensi dan kode contoh untuk penggunaan:
sumber
!string.IsNullOrEmpty(str)
pemeriksaan berhasil, menyebabkanvalues.Length > 0
kondisi diabaikan, tetapi panjang Nilai adalah 0 , maka ia akan pergi keforeach
dan kemudian segera putus karena tidak ada entri dalam larik, langsung menuju kereturn false
.Coba berikut ini.
sumber
LINQ di .NET 4.0 memiliki opsi lain untuk Anda; metode .Any ();
sumber
Any()
danAll()
metode sangat sederhana :) Saya bisa menggunakant => words.All(w => t.Title.Contains(w))
.Atau jika Anda sudah memiliki datanya dalam daftar dan lebih memilih format Linq yang lain :)
sumber
Bagaimana tentang:
sumber
Ini adalah contoh salah satu cara menulis metode ekstensi (catatan: Saya tidak akan menggunakan ini untuk array yang sangat besar; struktur data lain akan lebih sesuai ...):
sumber
Ini adalah jawaban yang terlambat, tapi saya yakin masih berguna .
Saya telah membuat paket nuget NinjaNye.SearchExtension yang dapat membantu memecahkan masalah ini .:
Anda juga dapat mencari beberapa properti string
Atau lakukan
RankedSearch
pengembalianIQueryable<IRanked<T>>
mana yang hanya menyertakan properti yang menunjukkan berapa kali istilah pencarian muncul:Ada panduan yang lebih luas di halaman GitHub proyek: https://github.com/ninjanye/SearchExtensions
Semoga ini bisa membantu pengunjung di masa depan
sumber
IQueryable
danIEnumerable
- jauhkan saja jika Anda merantai itu dari IEnumerable, itu akan berjalan dalam memeory daripada membuat kueri dan mengirimkannya ke sumberMetode ekstensi Linq. Akan bekerja dengan objek IEnumerable:
Pemakaian:
sumber
Saya yakin Anda juga bisa melakukan hal seperti ini.
sumber
Jadi, apakah saya berasumsi dengan benar bahwa uid adalah Unique Identifier (Guid)? Apakah ini hanya contoh skenario yang mungkin atau apakah Anda benar-benar mencoba menemukan panduan yang cocok dengan array string?
Jika ini benar, Anda mungkin ingin benar-benar memikirkan kembali seluruh pendekatan ini, ini sepertinya ide yang sangat buruk. Anda mungkin harus mencoba untuk mencocokkan Panduan ke Panduan
Sejujurnya saya tidak bisa membayangkan skenario di mana mencocokkan array string menggunakan "berisi" ke konten Panduan akan menjadi ide yang bagus. Untuk satu hal, Contains () tidak akan menjamin urutan angka dalam Panduan sehingga Anda berpotensi mencocokkan beberapa item. Belum lagi membandingkan panduan dengan cara ini akan jauh lebih lambat daripada hanya melakukannya secara langsung.
sumber
Anda harus menuliskannya sebaliknya, memeriksa daftar id pengguna Anda yang memiliki hak istimewa berisi id pada baris tabel itu:
LINQ berperilaku cukup cerah di sini dan mengubahnya menjadi pernyataan SQL yang baik:
yang pada dasarnya menyematkan konten larik 'pencarian' ke dalam kueri sql, dan melakukan pemfilteran dengan kata kunci 'IN' dalam SQL.
sumber
Saya berhasil menemukan solusi, tetapi tidak bagus karena memerlukan penggunaan AsEnumerable () yang akan mengembalikan semua hasil dari DB, untungnya saya hanya memiliki 1k catatan di tabel sehingga tidak terlalu terlihat, tapi begini .
Berikut postingan asli saya:
sumber
Solusi terbaik yang saya temukan adalah melanjutkan dan membuat Fungsi Table-Valued dalam SQL yang menghasilkan hasil, seperti ::
Kemudian, Anda cukup menyeret fungsi ke desainer LINQ.dbml Anda dan memanggilnya seperti Anda melakukan objek lain. LINQ bahkan mengetahui kolom dari fungsi yang Anda simpan. Saya menyebutnya seperti ini ::
Sangat sederhana dan benar-benar memanfaatkan kekuatan SQL dan LINQ dalam aplikasi ... dan Anda tentu saja dapat membuat tabel apa pun yang dinilai fungsi yang Anda inginkan untuk efek yang sama!
sumber
Saya percaya bahwa apa yang benar-benar ingin Anda lakukan adalah: bayangkan skenario Anda memiliki dua database dan mereka memiliki tabel produk yang sama Dan Anda ingin memilih produk dari tabel "A" yang memiliki kesamaan id dengan "B"
menggunakan metode berisi akan terlalu rumit untuk melakukan ini yang kami lakukan adalah persimpangan, dan ada metode yang disebut persimpangan untuk itu
contoh dari msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
int [] angka = (0, 2, 4, 5, 6, 8, 9); int [] bilanganB = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);
Saya pikir apa yang Anda butuhkan mudah diselesaikan dengan persimpangan
sumber
Periksa metode ekstensi ini:
sumber
sumber
Mencoba:
sumber
sumber
sumber
sumber
sumber