Apakah kueri ini setara dengan LEFT OUTER
gabungan?
//assuming that I have a parameter named 'invoiceId' of type int
from c in SupportCases
let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId)
where (invoiceId == 0 || invoice != null)
select new
{
Id = c.Id
, InvoiceId = invoice == null ? 0 : invoice.Id
}
.net
database
linq
linq-to-sql
Ali Kazmi
sumber
sumber
Anda tidak perlu pernyataan ke:
Dan ya, pertanyaan di atas memang membuat bergabung LEFT OUTER.
Tautan ke pertanyaan serupa yang menangani banyak gabungan kiri: Linq ke Sql: Banyak gabungan luar kiri
sumber
Periksa http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx
sumber
Saya menemukan 1 solusi. jika ingin menerjemahkan SQL semacam ini (gabung kiri) ke Linq Entity ...
SQL:
LINQ:
sumber
DefaultIfEmpty
.Saya ingin menambahkan satu hal lagi. Dalam LINQ ke SQL jika DB Anda dibangun dengan benar dan tabel Anda terkait melalui batasan kunci asing, maka Anda tidak perlu melakukan join sama sekali.
Menggunakan LINQPad saya membuat permintaan LINQ berikut:
Yang diterjemahkan ke kueri (sedikit terpotong) di bawah ini
Perhatikan hal di
LEFT OUTER JOIN
atas.sumber
Jaga kinerja:
Saya mengalami bahwa setidaknya dengan EF Core jawaban berbeda yang diberikan di sini mungkin menghasilkan kinerja yang berbeda. Saya sadar bahwa OP bertanya tentang Linq ke SQL, tetapi bagi saya sepertinya pertanyaan yang sama juga terjadi pada EF Core.
Dalam kasus tertentu yang harus saya tangani, saran (secara sintaksis lebih bagus) dari Marc Gravell menghasilkan gabungan kiri di dalam tanda silang berlaku - mirip dengan yang dideskripsikan oleh Mike U - yang menghasilkan hasil estimasi biaya untuk permintaan spesifik ini adalah dua. kali lebih tinggi dibandingkan dengan kueri tanpa gabungan silang . Waktu eksekusi server berbeda dengan faktor 3 . [1]
Solusi oleh Marc Gravell menghasilkan permintaan tanpa cross joins.
Konteks: Saya pada dasarnya perlu melakukan dua gabungan kiri pada dua tabel yang masing-masing lagi membutuhkan bergabung ke meja lain. Selain itu, di sana saya harus menentukan di mana-kondisi lain pada tabel di mana saya perlu menerapkan join kiri. Selain itu, saya memiliki dua gabungan batin di meja utama.
Perkiraan biaya operator:
Waktu eksekusi server dalam ms (kueri dieksekusi 10 kali; diukur menggunakan SET STATISTICS TIME ON):
(Run pertama sangat lambat untuk kedua query; tampaknya ada sesuatu yang di-cache.)
Ukuran meja:
Versi EF Core: 2.2.1.
Versi SQL Server: MS SQL Server 2017 - 14 ... (di Windows 10).
Semua tabel yang relevan memiliki indeks pada kunci utama saja.
Kesimpulan saya: selalu disarankan untuk melihat SQL yang dihasilkan karena dapat sangat berbeda.
[1] Cukup menarik, ketika mengatur 'Statistik klien' di MS SQL Server Management Studio aktif, saya bisa melihat tren yang berlawanan; yaitu bahwa menjalankan solusi terakhir tanpa cross berlaku membutuhkan lebih dari 1s. Saya kira ada sesuatu yang salah di sini - mungkin dengan pengaturan saya.
sumber