Saya mengalami masalah dengan kueri yang ditulis dalam LINQ dan Lambda. Sejauh ini, saya mendapatkan banyak kesalahan, inilah kode saya:
int id = 1;
var query = database.Posts.Join(database.Post_Metas,
post => database.Posts.Where(x => x.ID == id),
meta => database.Post_Metas.Where(x => x.Post_ID == id),
(post, meta) => new { Post = post, Meta = meta });
Saya baru menggunakan LINQ, jadi saya tidak yakin apakah kueri ini benar.
Jawaban:
Saya menemukan bahwa jika Anda terbiasa dengan sintaks SQL, menggunakan sintaks query LINQ jauh lebih jelas, lebih alami, dan membuatnya lebih mudah untuk menemukan kesalahan:
Jika Anda benar-benar terjebak dalam menggunakan lambdas, sintaks Anda agak tidak aktif. Inilah permintaan yang sama, menggunakan metode ekstensi LINQ:
sumber
lambda
dan adalah kutipan mudah digunakan dan dipahamiAnda bisa menggunakan dua cara dengan ini. Menggunakan LINQPad (tidak ternilai jika Anda baru mengenal LINQ) dan database dummy, saya membuat pertanyaan berikut:
atau
Dalam kasus khusus ini, saya pikir sintaks LINQ lebih bersih (saya mengubah keduanya tergantung yang paling mudah dibaca).
Hal yang ingin saya tunjukkan adalah bahwa jika Anda memiliki kunci asing yang sesuai dalam database Anda, (antara post dan post_meta) maka Anda mungkin tidak perlu bergabung secara eksplisit kecuali Anda mencoba memuat sejumlah besar catatan . Contoh Anda tampaknya menunjukkan bahwa Anda mencoba memuat satu posting dan itu adalah data meta. Dengan asumsi bahwa ada banyak catatan post_meta untuk setiap posting, maka Anda dapat melakukan hal berikut:
Jika Anda ingin menghindari masalah n +1, maka Anda dapat secara eksplisit memberi tahu LINQ ke SQL untuk memuat semua item terkait dalam sekali jalan (meskipun ini mungkin merupakan topik lanjutan saat Anda lebih terbiasa dengan L2S). Contoh di bawah ini mengatakan "ketika Anda memuat Posting, juga memuat semua catatan yang terkait dengannya melalui kunci asing yang diwakili oleh properti 'Post_metas'":
Dimungkinkan untuk melakukan banyak
LoadWith
panggilan pada satu setDataLoadOptions
untuk tipe yang sama, atau banyak tipe berbeda. Jika Anda melakukan ini banyak, Anda mungkin hanya ingin mempertimbangkan caching.sumber
Daniel memiliki penjelasan yang baik tentang hubungan sintaksis, tetapi saya mengumpulkan dokumen ini untuk tim saya agar lebih mudah dimengerti oleh mereka. Semoga ini bisa membantu seseorang
sumber
Post_ID
bidang di alias keduameta => meta.Post_ID
. Dalam contoh di ilustrasi ini,g.id
bagian dari pernyataan pilih asliJOIN gStatus g on g.id
tidak direplikasi dalam ekspresi Lambda akhir.public class IdHolder{ int id }
maka menggunakan objek itu di gStatusList<IdHolder> gStatus = new List<IdHolder>(); gStatus.add(new IdHolder(){id = 7}); gStatus.add(new IdHolder(){id = 8});
maka itu akan mengubah Linq menjadit =>t.value.TaskStatusId, g=>g.id
apakah perubahan itu masuk akal?Selektor kunci Anda salah. Mereka harus mengambil objek dari jenis tabel yang dimaksud dan mengembalikan kunci untuk digunakan dalam bergabung. Saya pikir maksud Anda ini:
Anda dapat menerapkan klausa di mana sesudahnya, bukan sebagai bagian dari pemilih kunci.
sumber
Posting karena ketika saya memulai LINQ + EntityFramework, saya menatap contoh-contoh ini selama sehari.
Jika Anda menggunakan EntityFramework, dan Anda memiliki properti navigasi yang disebutkan
Meta
padaPost
objek model yang Anda atur, ini mudah. Jika Anda menggunakan entitas dan tidak memiliki properti navigasi itu, tunggu apa lagi?Jika Anda melakukan kode terlebih dahulu, Anda akan mengatur properti dengan demikian:
sumber
Saya telah melakukan sesuatu seperti ini;
sumber
Bisa jadi sesuatu seperti
sumber
1 sama dengan 1 dua tabel yang berbeda
sumber
Kueri LINQ ini seharusnya bekerja untuk Anda. Ini akan mendapatkan semua posting yang memiliki postingan meta.
Query SQL Setara
sumber