Latar belakang: Selama bulan depan, saya akan memberikan tiga ceramah tentang atau setidaknya termasuk LINQ
dalam konteks C#
. Saya ingin tahu topik mana yang layak memberikan perhatian yang cukup, berdasarkan pada apa yang sulit dipahami orang, atau apa yang mereka anggap keliru. Saya tidak akan secara khusus berbicara tentang LINQ
ke SQL
atau Entity Framework kecuali sebagai contoh bagaimana query dapat dijalankan dari jarak jauh menggunakan pohon ekspresi (dan biasanya IQueryable
).
Jadi, apa yang menurut Anda sulit LINQ
? Apa yang Anda lihat dalam hal kesalahpahaman? Contohnya mungkin salah satu dari yang berikut, tapi tolong jangan membatasi diri Anda sendiri!
- Bagaimana
C#
kompiler memperlakukan ekspresi kueri - Ekspresi Lambda
- Pohon ekspresi
- Metode penyuluhan
- Jenis anonim
IQueryable
- Deferred vs eksekusi segera
- Streaming vs eksekusi buffered (mis. OrderBy ditangguhkan tetapi buffered)
- Variabel lokal yang diketik secara implisit
- Membaca tanda tangan umum yang kompleks (mis. Enumerable.Join )
Jawaban:
Eksekusi tertunda
sumber
Saya tahu konsep eksekusi yang ditangguhkan harus dipukuli oleh saya sekarang, tetapi contoh ini benar-benar membantu saya mendapatkan pemahaman praktis tentang hal itu:
Kode di atas mengembalikan yang berikut:
sumber
Bahwa ada lebih dari sekedar
LINQ
untukSQL
dan fitur lebih dari sekedarSQL
parser yang tertanam dalam bahasa.sumber
Notasi O besar . LINQ membuatnya sangat mudah untuk menulis algoritma O (n ^ 4) tanpa menyadarinya, jika Anda tidak tahu apa yang Anda lakukan.
sumber
Saya pikir fakta bahwa
Lambda
ekspresi dapat menyelesaikan baik pohon ekspresi maupun delegasi anonim, sehingga Anda dapat meneruskanlambda
ekspresi deklaratif yang sama keIEnumerable<T>
metodeIQueryable<T>
ekstensi dan metode ekstensi.sumber
Membawa saya cara terlalu lama untuk menyadari bahwa banyak metode ekstensi LINQ seperti
Single()
,SingleOrDefault()
dll memiliki overloads yang mengambil lambdas.Anda dapat melakukan :
dan tidak perlu mengatakan ini - yang mana beberapa tutorial buruk membuat saya terbiasa melakukannya
sumber
Count()
, antara lain. Apakah Anda tahu jika ada perbedaan kinerja, selain bonus keterbacaan kode yang jelas?Dalam LINQ to SQL saya selalu melihat orang-orang tidak memahami DataContext, bagaimana bisa digunakan dan bagaimana harus digunakan. Terlalu banyak orang tidak melihat DataContext untuk apa itu, objek Unit Kerja, bukan objek yang persisten.
Saya telah melihat banyak kali di mana orang mencoba untuk melajang sebuah DataContext / sesi itu / etc daripada membuat waktu baru untuk setiap operasi.
Dan kemudian ada pembuangan DataContext sebelum IQueryable telah dievaluasi tetapi itu lebih merupakan suatu kecenderungan ketika orang tidak memahami IQueryable daripada DataContext.
Konsep lain yang saya lihat banyak kebingungan adalah Query Syntax vs Expression Syntax. Saya akan menggunakan mana yang paling mudah pada saat itu, sering bertahan dengan Ekspresi Sintaks. Banyak orang masih tidak menyadari bahwa mereka akan menghasilkan hal yang sama pada akhirnya, Query dikompilasi menjadi Ekspresi.
sumber
Saya pikir yang disalahpahami bagian dari LINQ adalah bahwa itu adalah ekstensi bahasa , bukan perpanjangan database atau konstruk.
LINQ
jauh lebih dariLINQ to SQL
.Sekarang sebagian besar dari kita telah menggunakan
LINQ
koleksi, kita tidak akan pernah kembali!LINQ
adalah fitur paling signifikan untuk .NET sejak Generics in 2.0, dan Anonymous Types in 3.0.Dan sekarang kita memiliki Lambda, saya tidak sabar untuk pemrograman paralel!
sumber
Saya yakin ingin tahu apakah saya perlu tahu apa itu pohon ekspresi, dan mengapa.
sumber
Saya cukup baru untuk LINQ. Inilah beberapa hal yang membuat saya tersandung dalam usaha pertama saya
sumber
Sesuatu yang saya awalnya tidak sadari adalah bahwa sintaks LINQ tidak memerlukan
IEnumerable<T>
atauIQueryable<T>
untuk bekerja, LINQ hanya tentang pencocokan pola.alt teks http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
Inilah jawabannya (tidak, saya tidak menulis blog itu, Bart De Smet melakukannya, dan dia salah satu blogger terbaik di LINQ yang saya temukan).
sumber
Saya masih memiliki masalah dengan perintah "let" (yang saya tidak pernah menemukan digunakan untuk) dan SelectMany (yang saya gunakan, tapi saya tidak yakin saya melakukannya dengan benar)
sumber
Memahami kapan abstraksi di antara penyedia Linq bocor. Beberapa hal berfungsi pada objek tetapi tidak SQL (mis., TakeWhile). Beberapa metode dapat diterjemahkan ke dalam SQL (ToUpper) sementara yang lain tidak. Beberapa teknik lebih efisien dalam objek di mana yang lain lebih efektif dalam SQL (metode bergabung yang berbeda).
sumber
Beberapa barang.
sumber
OK, karena permintaan, saya telah menulis beberapa hal Ekspresi. Saya tidak 100% senang dengan bagaimana blogger dan LiveWriter berkonspirasi untuk memformatnya, tetapi itu akan berlaku untuk saat ini ...
Ngomong-ngomong, begini ... Saya suka umpan balik, terutama jika ada area di mana orang ingin informasi lebih lanjut.
Ini dia , suka atau benci ...
sumber
Beberapa pesan kesalahan, terutama dari LINQ ke SQL bisa sangat membingungkan. menyeringai
Saya telah digigit oleh eksekusi yang ditunda beberapa kali seperti orang lain. Saya pikir hal yang paling membingungkan bagi saya adalah Penyedia Kueri SQL Server dan apa yang dapat dan tidak bisa Anda lakukan dengannya.
Saya masih kagum dengan kenyataan Anda tidak dapat melakukan Jumlah () pada kolom desimal / uang yang terkadang kosong. Menggunakan DefaultIfEmpty () tidak akan berfungsi. :(
sumber
Saya pikir hal yang hebat untuk dibahas di LINQ adalah bagaimana Anda bisa mendapatkan diri Anda sendiri dalam masalah kinerja. Misalnya, menggunakan hitungan LINQ sebagai kondisi loop benar-benar tidak pintar.
sumber
IQueryable itu menerima keduanya,
Expression<Func<T1, T2, T3, ...>>
danFunc<T1, T2, T3, ...>
, tanpa memberi petunjuk tentang penurunan kinerja pada kasus ke-2.Berikut ini contoh kode, yang menunjukkan apa yang saya maksud:
sumber
Saya tidak tahu apakah itu memenuhi syarat sebagai disalahpahami - tetapi bagi saya, tidak diketahui.
Saya senang belajar tentang DataLoadOptions dan bagaimana saya bisa mengontrol tabel mana yang bergabung ketika saya membuat kueri tertentu.
Lihat di sini untuk info lebih lanjut: MSDN: DataLoadOptions
sumber
Saya akan mengatakan aspek LINQ yang paling disalahpahami (atau harus tidak dipahami?) Adalah penyedia LINQ yang dapat IQueryable dan kustom .
Saya telah menggunakan LINQ untuk sementara waktu sekarang dan saya benar-benar nyaman di dunia IEnumerable, dan dapat menyelesaikan sebagian besar masalah dengan LINQ.
Tetapi ketika saya mulai melihat dan membaca tentang IQueryable, dan penyedia Ekspresi dan LINQ kustom itu membuat kepala saya berputar. Lihatlah bagaimana LINQ to SQL berfungsi jika Anda ingin melihat beberapa logika yang cukup rumit.
Saya berharap dapat memahami aspek LINQ ...
sumber
Seperti yang dikatakan kebanyakan orang, saya pikir bagian yang paling disalahpahami adalah mengasumsikan LINQ hanyalah pengganti T-SQL. Manajer saya yang menganggap dirinya sebagai guru TSQL tidak akan membiarkan kami menggunakan LINQ dalam proyek kami dan bahkan membenci MS karena merilis hal seperti itu !!!
sumber
Apa yang diwakili var saat kueri dieksekusi?
Apakah
iQueryable
,iSingleResult
,iMultipleResult
, atau apakah itu berubah berdasarkan pada pelaksanaannya. Ada beberapa spekulasi tentang penggunaan (yang tampaknya) dinamis-mengetik vs standar statis mengetik di C #.sumber
Betapa mudahnya membuat sarang adalah sesuatu yang saya pikir tidak semua orang mengerti.
Sebagai contoh:
sumber
group by
masih membuat kepalaku berputar.Setiap kebingungan tentang eksekusi yang ditangguhkan harus dapat diselesaikan dengan melangkah melalui beberapa kode sederhana berbasis LINQ dan bermain-main di jendela arloji.
sumber
Kueri Terkompilasi
Kenyataan bahwa Anda tidak dapat rantai
IQueryable
karena mereka metode panggilan (sementara masih tidak lain SQL translateable!) Dan itu hampir mustahil untuk bekerja di sekitar itu mindboggling dan menciptakan pelanggaran besar KERING. Saya membutuhkanIQueryable
iklan ad-hoc di mana saya tidak mengkompilasi kueri (saya hanya mengkompilasi kueri untuk skenario berat), tetapi dalam kueri yang dikompilasi saya tidak dapat menggunakannya dan sebagai gantinya perlu menulis sintaks kueri reguler lagi. Sekarang saya melakukan subqueries yang sama di 2 tempat, perlu diingat untuk memperbarui keduanya jika ada perubahan, dan sebagainya. Mimpi buruk.sumber
Saya pikir kesalahpahaman # 1 tentang LINQ ke SQL adalah bahwa Anda MASIH HARUS TAHU SQL untuk memanfaatkannya secara efektif.
Hal lain yang disalahpahami tentang Linq ke Sql adalah bahwa Anda masih harus menurunkan keamanan basis data hingga tidak masuk akal untuk membuatnya bekerja.
Poin ketiga adalah bahwa menggunakan Linq ke Sql bersama dengan kelas Dynamic (artinya definisi kelas dibuat saat runtime) menyebabkan sejumlah besar kompilasi just-in-time. Yang benar-benar dapat mematikan kinerja.
sumber
Pemuatan Malas.
sumber
Seperti disebutkan, lazy loading dan eksekusi ditangguhkan
Bagaimana LINQ ke Objek dan LINQ ke XML (IEnumerable) berbeda dari LINQ ke SQL (IQueryable)
BAGAIMANA membangun Lapisan Akses Data, Lapisan Bisnis, dan Lapisan Presentasi dengan LINQ di semua lapisan .... dan contoh yang bagus.
sumber
Seperti yang dikatakan kebanyakan orang, saya pikir bagian yang paling disalahpahami adalah mengasumsikan LINQ hanyalah pengganti T-SQL. Manajer saya yang menganggap dirinya sebagai guru TSQL tidak akan membiarkan kami menggunakan LINQ dalam proyek kami dan bahkan membenci MS karena merilis hal seperti itu !!!
sumber
Transaksi (tanpa menggunakan TransactionScope)
sumber