Perbedaan antara antarmuka IQueryable, ICollection, IList & IDictionary

Saya mencoba memahami perbedaan antara antarmuka IQueryable, ICollection, IList & IDictionary yang lebih cepat untuk operasi dasar seperti iterasi, Pengindeksan, Kueri, dan banyak lagi.

kelas mana seperti Koleksi, Daftar, Kamus, dll yang sebaiknya dimulai dengan antarmuka ini dan kapan kita harus menggunakan kelas ini. Keuntungan dasar menggunakan kelas-kelas ini dibandingkan yang lain.

Saya mencoba membaca postingan lain dengan pertanyaan serupa tetapi tidak ada yang menjawab pertanyaan lengkap saya. Terima kasih untuk bantuannya.


person Praneeth    schedule 15.12.2010    source sumber


Jawaban (3)


Semua antarmuka ini mewarisi dari IEnumerable, yang harus Anda pastikan sudah Anda pahami. Antarmuka itu pada dasarnya memungkinkan Anda menggunakan kelas dalam pernyataan foreach (dalam C#).

  • ICollection adalah antarmuka paling dasar yang Anda daftarkan. Ini adalah antarmuka yang dapat dihitung yang mendukung Hitungan dan itu saja.
  • IList adalah segalanya yang dimiliki ICollection, namun juga mendukung penambahan dan penghapusan item, mengambil item berdasarkan indeks, dll. Ini adalah antarmuka yang paling umum digunakan untuk "daftar objek", yang saya tahu tidak jelas.
  • IQueryable adalah antarmuka enumerable yang mendukung LINQ. Anda selalu dapat membuat IQueryable dari IList dan menggunakan LINQ ke Objek, tetapi Anda juga menemukan IQueryable digunakan untuk eksekusi pernyataan SQL yang ditangguhkan di LINQ ke SQL dan LINQ ke Entitas.
  • IDictionary adalah binatang yang berbeda dalam arti bahwa ia merupakan pemetaan kunci unik terhadap nilai-nilai. Ini juga dapat dihitung karena Anda dapat menghitung pasangan kunci/nilai, tetapi selain itu, tujuannya berbeda dari pasangan kunci lain yang Anda daftarkan.

Dokumentasi MSDN untuk masing-masingnya cukup baik, jadi saya akan mulai dari sana untuk melengkapi pemahaman Anda.

person John Bledsoe    schedule 15.12.2010
comment
+1 untuk penjelasan mendetail tentang Antarmuka ini tetapi Anda melewatkan pertanyaan saya yang lain - person Praneeth; 16.12.2010
comment
Dalam hal versi umum antarmuka, ICollection‹T› mendukung Add/Remove/Clear/Contains/CopyTo sesuai msdn.microsoft.com/en-us/library/92t2ye13.aspx - person Joshua Rodgers; 16.12.2010

Saya melihat beberapa masalah pada jawaban @gunny229 di atas, itulah sebabnya saya menulis postingan ini. Saya telah menyebutkan masalah tersebut di area komentar postingannya juga. Untuk memperbaiki postingan itu saya harus menulis ulang hampir seluruh postingan jadi saya berpikir untuk membuatnya sendiri. Saya tidak bermaksud menjawab pertanyaan OP secara keseluruhan tetapi saya ingin menunjukkan perbedaan antara IQueryable dan IEnumerable saat menggunakan LINQ ke SQL.

Saya membuat struktur berikut di DB (skrip DDL):

CREATE TABLE [dbo].[Employee]([PersonId] [int] NOT NULL PRIMARY KEY,[Salary] [int] NOT NULL)

Berikut adalah skrip penyisipan catatan (skrip DML):

INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(1, 20)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(2, 30)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(3, 40)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(4, 50)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(5, 60)
GO

Sekarang tujuan saya adalah mendapatkan 2 catatan teratas dari tabel Employee di database. Jadi, saya menambahkan item Model Data Entitas ADO.NET ke dalam aplikasi konsol saya yang menunjuk ke tabel Employee di database saya dan mulai menulis kueri LINQ.

Kode untuk rute yang dapat dikueri:

using (var efContext = new EfTestEntities())
{
    IQueryable<int> employees = from e in efContext.Employees  select e.Salary;
    employees = employees.Take(2);

    foreach (var item in employees)
    {
        Console.WriteLine(item);
    }
}

Ketika saya mulai menjalankan program ini, saya juga memulai sesi profiler SQL Query pada contoh SQL Server saya dan berikut adalah ringkasan eksekusinya:

  1. Jumlah total kueri yang diaktifkan: 1
  2. Teks kueri: SELECT TOP (2) [c].[Salary] AS [Salary] FROM [dbo].[Employee] AS [c]

Hanya saja IQueryable cukup pintar untuk menerapkan klausa Top (2) pada sisi server database itu sendiri sehingga hanya membawa 2 dari 5 catatan melalui kabel. Pemfilteran lebih lanjut dalam memori tidak diperlukan sama sekali di sisi komputer klien.

Kode untuk rute IEnumerable:

using (var efContext = new EfTestEntities())
{
    IEnumerable<int> employees = from e in efContext.Employees  select e.Salary;
    employees = employees.Take(2);

    foreach (var item in employees)
    {
        Console.WriteLine(item);
    }
}

Ringkasan eksekusi dalam hal ini:

  1. Jumlah total kueri yang diaktifkan: 1
  2. Teks kueri yang diambil dalam profiler SQL: SELECT [Extent1].[Salary] AS [Salary] FROM [dbo].[Employee] AS [Extent1]

Sekarang masalahnya adalah IEnumerable membawa semua 5 catatan yang ada di tabel Salary dan kemudian melakukan pemfilteran dalam memori di komputer klien untuk mendapatkan 2 catatan teratas. Jadi lebih banyak data (3 catatan tambahan dalam kasus ini) ditransfer melalui kabel jika tidak perlu.

person RBT    schedule 26.04.2017
comment
Terima kasih, tapi menurut saya jawaban @gunny229 tidak menyesatkan. Ya, dia menggunakan kata 'query' tapi itu tidak dalam konteks database. Itu hanyalah perhitungan lain untuk mendapatkan dua teratas. Setidaknya itulah yang saya pikirkan saat membacanya. Bersulang. - person Ε Г И І И О; 06.12.2019

IQueryable, IList, IDictionary, ICollection mewarisi Antarmuka IEnumerable. Semua antarmuka kumpulan tipe akan mewarisi Antarmuka IEnumerable.

Perbedaan Antara IEnumerable dan IQueryable IEnumerable:-saat Anda menjalankan kueri yang mengembalikan tipe IEnumerable. IEnumerable pertama-tama akan mengeksekusi query pertama dan kemudian mengeksekusi sub query yang ditulis untuk query tersebut.

Contoh:-Jika Anda ingin mendapatkan 10 Catatan populasi teratas dari negara tertentu maka kueri yang akan kita gunakan di LinQ adalah

IEnumerable _Population=from s di India pilih s.population;//First Query _Population=_Population.take(10);//Second Query

Sekarang jika kita menjalankan kueri ini, Kueri Pertama akan dieksekusi terlebih dahulu, IEnumerable akan mendapatkan Catatan semua populasi dari server sql kemudian akan menyimpan data di memori Dalam Proses dan kemudian mengeksekusi 10 populasi teratas di Kueri berikutnya. (Eksekusi dilakukan dua kali di sql server).

jika kita menjalankan kueri yang sama dengan menggunakan IQueryable .

IQueryable _Population=from s di India pilih s.population;//First Query _Population=_Population.take(10);//Second Query

dalam IQueryable ini ia akan mengeksekusi dua Kueri secara bersamaan dalam arti ia akan mendapatkan populasi yang berada di 10 teratas dalam satu Kueri alih-alih mendapatkan data dan memfilter 10 Kueri pertama lagi. (Eksekusi satu kali di server sql) .

Kesimpulan untuk IQueryable dan IEnumerable

  1. Jika Anda menulis kueri terhadap data dalam database, gunakan IQueryable.
  2. Jika Anda menanyakan data yang sedang diproses, gunakan IEnumerable. IEnumerable memiliki metode GetEnumerator(),Current() dan MoveNext().
person gunny 229    schedule 23.03.2015
comment
Senang sekali mengetahui perbedaannya. (kamu) - person Wasim Bajwa; 27.03.2017
comment
metode ekstensi Take didefinisikan pada IEnumerable<T> sebagai gantinya. Saya memverifikasi bahwa hanya 1 kueri yang diaktifkan pada kedua kasus, baik itu IEnumerable atau IQueryable. Hanya saja IEnumerable melakukan pemfilteran dalam memori yang membawa data yang tidak diinginkan melalui kabel. - person RBT; 26.04.2017