Saya memiliki SQL berikut, yang saya coba terjemahkan ke LINQ:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17
WHERE p.companyid = 100
Saya telah melihat implementasi tipikal dari gabungan luar kiri (mis. into x from y in x.DefaultIfEmpty()
Dll . ) Tetapi saya tidak yakin bagaimana cara memperkenalkan kondisi gabungan lainnya ( AND f.otherid = 17
)
EDIT
Mengapa AND f.otherid = 17
kondisi bagian dari GABUNGAN bukan dalam klausa WHERE? Karena f
mungkin tidak ada untuk beberapa baris dan saya masih ingin baris ini dimasukkan. Jika kondisi tersebut diterapkan dalam klausa WHERE, setelah GABUNG - maka saya tidak mendapatkan perilaku yang saya inginkan.
Sayangnya ini:
from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.DefaultIfEmpty()
where p.companyid == 100 && fgi.otherid == 17
select f.value
tampaknya setara dengan ini:
SELECT f.value
FROM period as p
LEFT OUTER JOIN facts AS f ON p.id = f.periodid
WHERE p.companyid = 100 AND f.otherid = 17
yang tidak cukup apa yang saya cari.
c#
sql
linq
linq-to-sql
outer-join
dan
sumber
sumber
Jawaban:
Anda harus memperkenalkan kondisi bergabung Anda sebelum menelepon
DefaultIfEmpty()
. Saya hanya akan menggunakan sintaks metode ekstensi:Atau Anda bisa menggunakan subquery:
sumber
ini juga berfungsi, ... jika Anda memiliki beberapa kolom bergabung
sumber
Saya tahu ini " agak terlambat " tetapi untuk berjaga-jaga jika ada yang perlu melakukan ini dalam sintaksis Metode LINQ ( itulah sebabnya saya menemukan posting ini pada awalnya ), ini akan menjadi cara melakukannya:
sumber
.Select(fact.Value)
seharusnya.Select(f => f.Value)
Opsi lain yang valid adalah untuk menyebarkan gabungan di beberapa klausa LINQ , sebagai berikut:
sumber
Dapat ditulis menggunakan kunci gabungan gabungan. Juga jika ada kebutuhan untuk memilih properti dari sisi kiri dan kanan, LINQ dapat ditulis sebagai
sumber
Sepertinya saya ada nilai dalam mempertimbangkan beberapa penulisan ulang untuk kode SQL Anda sebelum mencoba menerjemahkannya.
Secara pribadi, saya akan menulis permintaan seperti itu sebagai gabungan (meskipun saya akan menghindari nol sepenuhnya!):
Jadi saya kira saya setuju dengan semangat jawaban @ MAbraham1 (meskipun kode mereka tampaknya tidak terkait dengan pertanyaan).
Namun, tampaknya kueri dirancang khusus untuk menghasilkan hasil kolom tunggal yang terdiri dari baris duplikat - memang duplikat nol! Sulit untuk tidak sampai pada kesimpulan bahwa pendekatan ini cacat.
sumber