Saya perlu melakukan kueri LINQ2DataSet yang melakukan gabungan pada lebih dari satu bidang (sebagai
var result = from x in entity
join y in entity2
on x.field1 = y.field1
and
x.field2 = y.field2
Saya belum menemukan solusi yang sesuai (saya bisa menambahkan batasan ekstra ke klausa mana, tapi ini jauh dari solusi yang cocok, atau menggunakan solusi ini , tetapi mengasumsikan equijoin).
Apakah mungkin di LINQ untuk bergabung di beberapa bidang dalam satu gabungan?
EDIT
var result = from x in entity
join y in entity2
on new { x.field1, x.field2 } equals new { y.field1, y.field2 }
adalah solusi yang saya referensikan dengan mengasumsikan equijoin di atas.
EDIT selanjutnya
Untuk menjawab kritik bahwa contoh asli saya adalah equijoin, saya mengakui bahwa, Persyaratan saya saat ini adalah untuk equijoin dan saya sudah menggunakan solusi yang saya rujuk di atas.
Namun, saya mencoba memahami kemungkinan dan praktik terbaik apa yang saya / harus saya pakai dengan LINQ. Saya akan perlu melakukan permintaan rentang Tanggal bergabung dengan ID tabel segera, dan baru saja mengatasi masalah itu, Sepertinya saya harus menambahkan rentang tanggal dalam klausa di mana.
Terima kasih, seperti biasa, untuk semua saran dan komentar yang diberikan
Jawaban:
Solusi dengan tipe anonim seharusnya bekerja dengan baik. LINQ hanya bisa mewakili equijoins (dengan klausa join, sih), dan memang itulah yang Anda katakan ingin Anda ekspresikan berdasarkan permintaan awal Anda.
Jika Anda tidak menyukai versi dengan jenis anonim karena alasan tertentu, Anda harus menjelaskan alasan itu.
Jika Anda ingin melakukan sesuatu selain dari apa yang semula Anda minta, tolong berikan contoh apa yang benar - benar ingin Anda lakukan.
EDIT: Menanggapi hasil edit dalam pertanyaan: ya, untuk melakukan "rentang tanggal" bergabung, Anda perlu menggunakan klausa tempat. Mereka benar-benar setara secara semantik, jadi itu hanya masalah optimisasi yang tersedia. Equijoins memberikan optimasi sederhana (dalam LINQ ke Objek, yang mencakup LINQ ke DataSet) dengan membuat pencarian berdasarkan urutan dalam - anggap sebagai hashtable dari kunci ke urutan entri yang cocok dengan kunci itu.
Melakukannya dengan rentang tanggal agak sulit. Namun, tergantung pada apa yang Anda maksud dengan "rentang tanggal bergabung" Anda mungkin dapat melakukan sesuatu yang serupa - jika Anda berencana membuat "band" tanggal (misalnya satu per tahun) sedemikian rupa sehingga dua entri yang terjadi di tahun yang sama (tetapi tidak pada tanggal yang sama) harus cocok, maka Anda dapat melakukannya hanya dengan menggunakan band itu sebagai kuncinya. Jika lebih rumit, misalnya satu sisi gabungan menyediakan rentang, dan sisi lain gabungan menyediakan satu tanggal, cocok jika itu berada dalam rentang itu, yang akan lebih baik ditangani dengan
where
klausa (setelah satu detikfrom
klausa) IMO. Anda dapat melakukan sihir yang sangat funky dengan memesan satu sisi atau yang lain untuk menemukan kecocokan yang lebih efisien, tetapi itu akan banyak pekerjaan - saya hanya akan melakukan hal semacam itu setelah memeriksa apakah kinerja merupakan masalah.sumber
sumber
on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }
Ini berhasilAnda perlu melakukan ini, jika nama kolom berbeda dalam dua entitas.
sumber
Hanya untuk melengkapinya dengan sintaksis rantai metode yang setara:
Sedangkan argumen terakhir
(x, y) => x
adalah apa yang Anda pilih (dalam kasus di atas kami pilihx
).sumber
Saya pikir pilihan yang lebih mudah dibaca dan fleksibel adalah dengan menggunakan fungsi Where:
Ini juga memungkinkan untuk dengan mudah mengubah dari join dalam ke join kiri dengan menambahkan .DefaultIfEmpty ().
sumber
{ ... } equals new { ... }
sintaks baru . LinqPad adalah alat yang hebat untuk melihat bagaimana ekspresi berperilaku (skrip SQL jika LINQ2SQL digunakan, pohon ekspresi dll.)sumber
Anda dapat melakukan sesuatu seperti (di bawah)
sumber
Menggunakan operator gabungan, Anda hanya dapat melakukan equijoins. Gabungan jenis lain dapat dibangun menggunakan operator lain. Saya tidak yakin apakah gabungan persis yang Anda coba lakukan akan lebih mudah menggunakan metode ini atau dengan mengubah klausa di mana. Dokumentasi pada klausa gabungan dapat ditemukan di sini . MSDN memiliki artikel tentang operasi gabungan dengan banyak tautan ke contoh dari gabungan lain, juga.
sumber
Jika nama bidang berbeda dalam entitas
sumber
Sebagai rantai metode lengkap yang akan terlihat seperti ini:
sumber
ini bekerja untuk saya
sumber
Deklarasikan Kelas (Jenis) untuk menampung elemen yang ingin Anda gabungkan. Dalam contoh di bawah ini menyatakan JoinElement
sumber