cari
  • Log masuk
  • Daftar
Penetapan semula kata laluan berjaya

Ikuti proiects vou berminat dengan andi aet terbaru mengenai mereka

Jadual Kandungan
Bilakah IQueryable benar-benar melaksanakan pertanyaan?
Mengapakah IQueryable menggunakan Expression> dan bukannya Func ?
Apakah yang berlaku jika anda mencampurkan panggilan IQueryable dan IEnumerable ?
Bolehkah anda menukar IQueryable kepada IEnumerable dengan selamat?
Rumah pembangunan bahagian belakang Tutorial C#.Net Apakah perbezaan antara IQueryable dan IEnumerable dalam C# LINQ?

Apakah perbezaan antara IQueryable dan IEnumerable dalam C# LINQ?

Jan 27, 2026 am 12:08 AM

IQueryable hanya dilaksanakan apabila kaedah terminal seperti .ToList(), .First(), atau .Count() dipanggil; sehingga itu, ia membina dan menangguhkan pokok ekspresi untuk terjemahan jauh (cth, ke SQL), tidak seperti IEnumerable yang menilai serta-merta dalam ingatan.

Apakah perbezaan antara IQueryable dan IEnumerable dalam C# LINQ?

Bilakah IQueryable benar-benar melaksanakan pertanyaan?

IQueryable menangguhkan pelaksanaan sehingga anda memanggil kaedah terminal — seperti .ToList() , .First() , atau .Count() . Sehingga itu, ia hanya membina pokok ekspresi. Pokok itu diterjemahkan (cth, kepada SQL) dan dilaksanakan hanya apabila dipaksa.

Inilah sebabnya mengapa memanggil .Where(...) pada IQueryable belum lagi menyentuh pangkalan data — ia hanya ditambahkan pada pokok ungkapan. Tetapi jika anda secara tidak sengaja memaksa penilaian awal (cth, dengan memanggil .AsEnumerable() dahulu), semuanya selepas dijalankan dalam ingatan.

  • IQueryable.Where(...) → kekal jauh (cth, menjadi WHERE dalam SQL)
  • IEnumerable.Where(...) → menarik semua data ke dalam memori dahulu, kemudian menapis secara setempat
  • Memanggil .AsEnumerable() atau .ToList() pada IQueryable mencetuskan pelaksanaan serta-merta dan terwujud

Mengapakah IQueryable<t></t> menggunakan Expression<func bool>&gt;</func> dan bukannya Func<t bool></t> ?

Perbezaan utama terletak pada cara predikat diluluskan: IQueryable mengharapkan Expression<func bool>&gt;</func> , bukan perwakilan mentah. Itu membolehkan pembekal (cth, Rangka Kerja Entiti) memeriksa, menulis semula dan menterjemah logik — seperti menukar x.Name == "A" menjadi SQL WHERE Name = 'A' .

IEnumerable , sebaliknya, menerima Func<t bool></t> biasa — yang disusun IL, bukan kod yang boleh diperiksa. Jadi ia hanya boleh dijalankan pada objek yang telah dimuatkan.

 var queryable = dbContext.Users.AsQueryable();
// ✅ OK: Berasaskan ungkapan, diterjemahkan kepada SQL
var filteredQ = queryable.Where(x =&gt; x.IsActive &amp;&amp; x.Umur &gt; 18);
<p>var enumerable = dbContext.Users.ToList().AsEnumerable();
// ✅ OK: Berasaskan fungsi, berjalan dalam ingatan
var filteredE = enumerable.Where(x =&gt; x.IsActive &amp;&amp; x.Umur &gt; 18);</p><p> // ❌ Tidak akan menyusun: Tidak dapat menukar Func kepada Ungkapan secara tersirat
// var bad = queryable.Where((Func<user bool>)(x =&gt; x.IsActive));</user></p>

Apakah yang berlaku jika anda mencampurkan panggilan IQueryable dan IEnumerable ?

Mencampurkannya sering menyebabkan pepijat prestasi senyap. Sebaik sahaja anda memanggil mana-mana sambungan IEnumerable (seperti .Select(...) selepas .AsEnumerable() ), rantaian yang lain menjalankan bahagian klien — walaupun sumber itu pada asalnya disokong pangkalan data.

  • dbContext.Products.Where(p =&gt; p.Price &gt; 100).OrderBy(p =&gt; p.Name).Take(10) → all in SQL
  • dbContext.Products.AsEnumerable().Where(p =&gt; p.Price &gt; 100).OrderBy(p =&gt; p.Name) → tarik *semua produk* ke dalam ingatan dahulu
  • dbContext.Products.Where(p =&gt; p.Price &gt; 100).AsEnumerable().Count() → menapis dari jauh, kemudian memuatkan baris yang sepadan hanya untuk mengiranya dalam memori

Perhatikan .AsEnumerable() , .ToList() , atau .ToArray() yang tidak disengajakan sebelum operasi akhir — terutamanya di dalam kaedah boleh guna semula yang menerima IQueryable<t></t> tetapi panggil .AsEnumerable() "untuk berjaga-jaga".

Bolehkah anda menukar IQueryable kepada IEnumerable dengan selamat?

Anda boleh — tetapi hanya apabila anda berhasrat untuk beralih kepada penilaian dalam ingatan. Penukaran itu sendiri adalah murah ( .AsEnumerable() hanyalah lakonan), tetapi perkara berikut menentukan kos.

  • .AsEnumerable() → pembungkus selamat, tiada pelaksanaan dicetuskan lagi
  • .ToList() , .ToArray() , .ToDictionary() → memaksa penilaian penuh dan peruntukan memori
  • Melepasi IQueryable kepada kaedah yang menjangkakan IEnumerable boleh menyebabkan kewujudan pramatang jika kaedah itu berulang atau memanggil ops terminal

Jika anda membina pertanyaan boleh gubah, lebih suka menyimpan IQueryable<t></t> selama mungkin — terutamanya merentas lapisan. Penukaran terlalu awal kehilangan keupayaan untuk menolak penapisan, pengisihan dan unjuran ke sumber data.

Atas ialah kandungan terperinci Apakah perbezaan antara IQueryable dan IEnumerable dalam C# LINQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Alat popular

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengesahkan alamat e-mel dalam C#? (Corak regex) Bagaimana untuk mengesahkan alamat e-mel dalam C#? (Corak regex) Mar 08, 2026 am 12:06 AM

Adalah disyorkan untuk menggunakan biasa rasmi ringan Microsoft ^[a-zA-Z0-9._% -] @[a-zA-Z0-9.-] \.[a-zA-Z]{2,}$ untuk pengesahan format e-mel asas, meliputi 99% daripada input sebenar; cara yang lebih dipercayai ialah menggunakan pembina MailAddress dan hanya menangkap FormatException, sambil mengesahkan rentetan null/kosong terlebih dahulu.

Bagaimana untuk menggunakan refleksi untuk mendapatkan nilai harta dalam C#? (GetType) Bagaimana untuk menggunakan refleksi untuk mendapatkan nilai harta dalam C#? (GetType) Mar 06, 2026 am 12:15 AM

GetProperty harus digunakan bersama dengan GetValue untuk mendapatkan nilai harta dan bukannya hanya memanggil GetType; adalah perlu untuk memberi perhatian kepada butiran seperti keterlihatan harta, perhubungan warisan dan pengindeks, dan disyorkan untuk cache PropertyInfo untuk meningkatkan prestasi.

Bagaimana untuk menggunakan sifat dengan get set dalam C#? (Encapsulation) Bagaimana untuk menggunakan sifat dengan get set dalam C#? (Encapsulation) Mar 10, 2026 am 12:33 AM

get/set tidak hanya menambah kurungan, tetapi merangkum titik permulaan: medan eksplisit diperlukan, operasi yang memakan masa dielakkan, ArgumentException dilemparkan apabila pengesahan gagal, pengubah suai akses berbeza disokong, init terhad kepada senario permulaan dan atribut logik pada asasnya ialah kaedah. Perhatian khusus mesti diberikan kepada penyahpepijatan dan prestasi.

Bagaimana untuk memisahkan rentetan dengan pembatas dalam C#? (String.Split) Bagaimana untuk memisahkan rentetan dengan pembatas dalam C#? (String.Split) Mar 12, 2026 am 12:21 AM

Ya, String.Split mengembalikan rentetan kosong secara lalai, menyebabkan item kosong disebabkan oleh pembatas berterusan atau pertama dan terakhir; anda perlu menggunakan StringSplitOptions.RemoveEmptyEntries untuk menapis, atau menapis secara manual; char[] digunakan untuk pemisahan aksara tunggal, dan rentetan[] digunakan untuk pemisahan subrentetan; Span.Split boleh mengelakkan peruntukan; melepasi had atas nombor akan memotong keputusan.

Bagaimana untuk menulis ke fail teks dalam C#? (Contoh StreamWriter) Bagaimana untuk menulis ke fail teks dalam C#? (Contoh StreamWriter) Mar 05, 2026 am 12:14 AM

Anda mesti menggunakan menggunakan untuk memastikan bahawa StreamWriter dikeluarkan dengan betul. Laluan perlu dibina dengan Path.Combine dan direktori mesti dibuat terlebih dahulu. File.WriteAllText atau File.AppendAllText lebih disukai untuk memudahkan operasi.

Bagaimana untuk menggunakan jenis nullable dalam C#? (Jenis rujukan boleh batal) Bagaimana untuk menggunakan jenis nullable dalam C#? (Jenis rujukan boleh batal) Mar 06, 2026 am 12:14 AM

Selepas mendayakan nullable, rentetan bermaksud bukan nol (ralat akan dilaporkan jika null diberikan atau dereference tidak dikesan), string? secara eksplisit membenarkan null; fail lama perlu #nullableenable secara eksplisit untuk berkuat kuasa; API luaran lalai kepada kemungkinan null.

Bagaimana untuk menyertai rentetan dengan pemisah dalam C#? (String.Join) Bagaimana untuk menyertai rentetan dengan pemisah dalam C#? (String.Join) Mar 13, 2026 am 12:02 AM

String.Join direka khas untuk penyambungan rentetan. Ia selamat, cekap dan sangat mudah dibaca. Hanya masukkan pembatas dan tatasusunan rentetan, dan elemen nol akan dilangkau secara automatik. Tatasusunan kosong atau null akan mengembalikan rentetan kosong. Pemformatan eksplisit diperlukan untuk mengendalikan jenis bukan rentetan. Dalam senario sensitif prestasi, tatasusunan diluluskan dahulu dan bukannya IEnumerable. StringBuilder sesuai untuk logik yang kompleks.

Bagaimana untuk mengukur masa pelaksanaan dalam C#? (Kelas jam randik) Bagaimana untuk mengukur masa pelaksanaan dalam C#? (Kelas jam randik) Mar 16, 2026 am 12:13 AM

Jam randik.Start() perlu dipanggil untuk kejadian yang tidak dimulakan, jika tidak InvalidOperationException akan dilemparkan; StartNew() ialah kaedah statik yang boleh dibuat dan dimulakan dalam satu langkah, menjadikannya lebih selamat dan lebih biasa digunakan.

Artikel berkaitan