Saya memiliki fungsi di mana saya mendapatkan daftar id, dan saya perlu mengembalikan daftar yang cocok dengan deskripsi yang terkait dengan id. Misalnya:
public class CodeData
{
string CodeId {get; set;}
string Description {get; set;}
}
public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
//Given the list of institution codes, return a list of CodeData
//having the given CodeIds
}
Jadi jika saya membuat sql untuk ini sendiri, saya hanya akan melakukan sesuatu seperti berikut (di mana klausa in berisi semua nilai dalam argumen codeIds):
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
Dalam Linq ke Sql saya tidak bisa menemukan padanan dari klausa "IN". Yang terbaik yang saya temukan sejauh ini (yang tidak berfungsi) adalah:
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
Masalahnya, saya tidak dapat secara dinamis menghasilkan daftar klausa "ATAU" untuk linq ke sql, karena mereka disetel pada waktu kompilasi.
Bagaimana seseorang mencapai klausa where yang memeriksa kolom dalam daftar nilai dinamis menggunakan Linq ke Sql?
sumber
codeIDs
aList<int>
, dan semua akan baik-baik saja.Anda juga bisa menggunakan:
sumber
Saya telah menggunakan metode dalam jawaban Jon Skeet, tetapi metode lain terpikir oleh saya
Concat
. TheConcat
metode yang dilakukan sedikit lebih baik dalam tes terbatas, tapi itu merepotkan dan saya mungkin akan hanya dengan tongkatContains
, atau mungkin aku akan menulis metode pembantu untuk melakukan hal ini untuk saya. Apa pun pilihannya, berikut opsi lain jika ada yang tertarik:Metode
Uji kinerja
Ini sama sekali tidak ilmiah. Saya membayangkan struktur database Anda dan jumlah ID yang terlibat dalam daftar akan berdampak signifikan.
Saya menyiapkan tes di mana saya melakukan 100 percobaan masing-masing
Concat
dan diContains
mana setiap percobaan melibatkan pemilihan 25 baris yang ditentukan oleh daftar kunci primer secara acak. Saya telah menjalankan ini sekitar belasan kali, dan sering kaliConcat
metode ini keluar 5 - 10% lebih cepat, meskipun satu kaliContains
metode dimenangkan hanya dengan sedikit.sumber
sumber
Inilah cara saya melakukannya dengan menggunakan HashSet
HashSet pada dasarnya hampir ke O (1) jadi kompleksitas Anda tetap O (n).
sumber