Apa itu LINQ dan apa fungsinya? [Tutup]


126

Apa itu LINQ? Saya tahu ini untuk database, tetapi apa fungsinya?


20
Saya percaya saya telah mengalahkan kriteria "tidak bisa dijawab secara masuk akal". Tidak ada alasan pertanyaan ini harus ditutup.
Amy B

Jawaban:


171

LINQ adalah singkatan dari Language Integrated Query .

Alih-alih menulis YAQL (Yet Another Query Language), pengembang bahasa Microsoft menyediakan cara untuk mengekspresikan kueri langsung dalam bahasa mereka (seperti C # dan Visual Basic). Teknik untuk membentuk kueri ini tidak bergantung pada detail implementasi dari hal yang sedang ditanyakan, sehingga Anda dapat menulis kueri yang valid terhadap banyak target (basis data, objek dalam-memori, XML) dengan praktis tidak mempertimbangkan cara yang mendasari di mana permintaan akan dieksekusi.

Mari kita mulai eksplorasi ini dengan bagian-bagian yang dimiliki oleh .NET Framework (3.5).

  • LINQ To Objects - periksa System.Linq.Enumerable untuk metode kueri. Target ini IEnumerable<T>, memungkinkan koleksi loopable yang diketik untuk ditanyakan dengan cara yang aman. Kueri ini mengandalkan metode .NET yang dikompilasi, bukan Ekspresi.

  • LINQ To Anything - periksa System.Linq.Queryable untuk beberapa metode kueri. Sasaran ini IQueryable<T>, memungkinkan pembangunan Pohon Ekspresi yang dapat diterjemahkan oleh implementasi yang mendasarinya.

  • Pohon Ekspresi - periksa System.Linq.Expressions namespace. Ini adalah kode sebagai data. Dalam praktiknya, Anda harus mengetahui hal ini, tetapi tidak benar-benar perlu menulis kode untuk jenis ini. Fitur bahasa (seperti ekspresi lambda) dapat memungkinkan Anda untuk menggunakan berbagai tangan pendek untuk menghindari berurusan dengan jenis ini secara langsung.

  • LINQ To SQL - memeriksa namespace System.Data.Linq . Terutama perhatikan DataContext. Ini adalah teknologi DataAccess yang dibangun oleh tim C #. Itu hanya bekerja.

  • LINQ To Entities - periksa namespace System.Data.Objects . Terutama perhatikan ObjectContext. Ini adalah teknologi DataAccess yang dibangun oleh tim ADO.NET. Ini kompleks, kuat, dan lebih sulit digunakan daripada LINQ To SQL.

  • LINQ To XML - periksa System.Xml.Linq namespace. Pada dasarnya, orang tidak puas dengan barang-barang itu System.Xml. Jadi Microsoft menulis ulang dan memanfaatkan penulisan ulang untuk memperkenalkan beberapa metode yang membuatnya lebih mudah untuk menggunakan LINQ To Objects melawan XML.

  • Beberapa jenis pembantu yang bagus, seperti Func dan Action . Tipe ini adalah delegasi dengan Dukungan Umum. Lewat sudah hari-hari menyatakan jenis delegasi kustom Anda (dan tidak dapat dipertukarkan).

Semua hal di atas adalah bagian dari .NET Framework, dan tersedia dari bahasa .NET apa pun (VB.NET, C #, IronPython, COBOL .NET, dll.).


Oke, aktifkan fitur bahasa. Saya akan tetap menggunakan C #, karena itulah yang saya tahu paling baik. VB.NET juga memiliki beberapa perbaikan serupa (dan pasangan yang tidak mendapatkan C # - XML ​​literal). Ini adalah daftar singkat dan tidak lengkap.

  • Metode Ekstensi - ini memungkinkan Anda untuk "menambahkan" metode untuk mengetik. Metode ini benar-benar metode statis yang meneruskan turunan dari tipe tersebut, dan terbatas pada kontrak publik dari tipe tersebut, tetapi sangat berguna untuk menambahkan metode ke tipe yang tidak Anda kontrol (string), atau menambahkan (sepenuhnya diimplementasikan ) metode pembantu ke antarmuka.

  • Sintaks Pemahaman Kueri - ini memungkinkan Anda untuk menulis dalam struktur Suka SQL. Semua hal ini diterjemahkan ke metode di System.Linq.Queryable atau System.Linq.Enumerable (tergantung pada Jenis myCustomers). Ini sepenuhnya opsional dan Anda dapat menggunakan LINQ dengan baik tanpa itu. Satu keuntungan dari gaya deklarasi kueri ini adalah bahwa variabel jangkauan dicakup: variabel tidak perlu dideklarasikan ulang untuk setiap klausa.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
    
  • Ekspresi Lambda - Ini adalah singkatan untuk menentukan metode. Compiler C # akan menerjemahkan masing-masing menjadi metode anonim atau true System.Linq.Expressions.Expression. Anda benar-benar perlu memahami ini untuk menggunakan Linq dengan baik. Ada tiga bagian: daftar parameter, panah, dan badan metode.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
    
  • Jenis Anonim - Terkadang kompiler memiliki informasi yang cukup untuk membuat jenis untuk Anda. Tipe-tipe ini tidak benar-benar anonim: kompiler menamainya ketika membuatnya. Tetapi nama-nama itu dibuat pada waktu kompilasi, yang sudah terlambat bagi pengembang untuk menggunakan nama itu pada waktu desain.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
    
  • Jenis Tersirat - Kadang-kadang kompiler memiliki informasi yang cukup dari inisialisasi yang dapat mengetahui jenis untuk Anda. Anda dapat menginstruksikan kompiler untuk melakukannya dengan menggunakan kata kunci var. Pengetikan implisit diperlukan untuk mendeklarasikan variabel untuk Tipe Anonim, karena programmer tidak boleh menggunakan nama tipe anonim .

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
    

14

LINQ (Language INtegrated Query) dapat merujuk ke:

  • perpustakaan untuk koleksi dan manipulasi iterator yang memanfaatkan fungsi tingkat tinggi sebagai argumen (System.Linq)

  • perpustakaan untuk meneruskan dan memanipulasi fungsi sederhana sebagai pohon sintaksis abstrak (System.Linq.Expressions)

  • ekstensi sintaksis ke berbagai bahasa untuk menyediakan sintaksis yang lebih mirip SQL untuk memproses koleksi, notasi yang lebih ringkas untuk fungsi anonim, dan mekanisme untuk memperkenalkan fungsi pembantu statis yang secara sintaktis tidak dapat dibedakan dari fungsi anggota akhir

  • definisi antarmuka yang dapat disesuaikan oleh penyedia data untuk menerima struktur permintaan dan berpotensi melakukan pengoptimalan atasnya, atau kadang-kadang penyedia data yang kompatibel sendiri

Komponen dapat digunakan dalam isolasi atau gabungan.



6

Saya akan mencoba jawaban sederhana: LINQ adalah cara bagi Anda untuk melakukan query database Anda (atau datastore lainnya, XML dll) menggunakan bahasa query yang mirip dengan SQL tetapi dapat dikompilasi di dalam aplikasi .NET.


1
Jadi apa sebenarnya perbedaan antara Linq dan SQL?
Kredns

Ada nama yang lebih canggih untuk ini, saya pikir tetapi strukturnya berbeda: SQL adalah Select From Where dan LINQ adalah From Where Select. LINQ lebih mudah di-loop. LINQ lebih mudah :) dan SQL yang dihasilkannya biasanya cukup baik mengingat penghematan waktu.
jcollum

2
sejujurnya, orang dapat berargumen bahwa SQL harus ditulis sebagai From Where Select, etc.- yaitu harus ditulis dengan cara Set Hasil benar-benar dibentuk
Don Cheadle

6

LINQ adalah kependekan dari Language Integrated Query , dan merupakan cara untuk menyediakan mekanisme "permintaan" tujuan umum di CLR.

Pada level paling dasar, ini terdiri dari serangkaian metode pada IEnumerable <T> - mis., Select, Sum, Where - yang dapat digunakan untuk pembatasan, proyeksi, dll. [1]

Untuk mengambilnya sedikit lebih jauh, LINQ juga mendefinisikan model penyedia LINQ baru yang dapat mengambil pohon ekspresi dan menggunakannya untuk menjalankan kueri "asli" terhadap sumber data di luar CLR - mis., LINQ ke SQL, LINQ ke XML, LINQ ke XML, LINQ ke NHibernate, dll.

C # dan VB.NET juga telah mendefinisikan sintaks kueri yang memungkinkan Anda untuk menulis inline yang diketik dengan sangat kuat (yang terlihat sangat mirip dengan SQL), yang kemudian diterjemahkan oleh kompiler ke dalam panggilan IETumerum yang setara dengan <T>.

Bagi saya, hal yang paling menarik tentang LINQ adalah semua fitur C # dan VB.NET yang diperlukan untuk mendukungnya berguna dalam hak mereka sendiri. Metode ekstensi, tipe anonim, ekspresi lambda, dan pengetikan implisit semuanya diperlukan untuk mendukung LINQ - tetapi kami cenderung menggunakan fitur-fitur tersebut di luar konteks LINQ murni.

[1] Itu adalah istilah relasional, pemrogram fungsional mungkin lebih suka Peta, Kurangi, Lipat, dll.


5

LINQ adalah teknologi untuk mengekstraksi data menggunakan idiom yang berasal dari bahasa pemrograman C #. Meskipun berutang banyak dalam desain fungsional untuk SQL, pada dasarnya bahasa query data sendiri. Ini beroperasi di spektrum yang luas dari sumber data (database SQL, representasi dalam memori, XML, dll.). LINQ-To-SQL, khususnya, harus dilihat sebagai kontras dengan penggunaan tradisional embedded SQL yang menderita dari apa yang sering disebut sebagai "ketidakcocokan impedansi" antara pemrograman SQL dan pemrograman C # / VB.

Untuk diskusi tentang LINQ dan batasan-batasannya, Anda mungkin ingin melihat pertanyaan terkait ini: Apakah LINQ to SQL tidak tepat?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"Proyek LINQ adalah nama kode untuk satu set ekstensi ke .NET Framework yang mencakup operasi query, set, dan transform yang terintegrasi bahasa. Proyek ini memperluas C # dan Visual Basic dengan sintaksis bahasa asli untuk kueri dan menyediakan perpustakaan kelas untuk memanfaatkan kemampuan ini. "


Jadi itu untuk database? Untuk apa yang saya lihat di sini (dalam SO) lebih seperti untuk koleksi di lingkungan .net.
OscarRyz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.