Bagikan melalui


Membuat Kueri Lintas Hubungan

Referensi ke objek lain atau kumpulan objek lain dalam definisi kelas Anda secara langsung terkait dengan hubungan kunci asing dalam database. Anda bisa menggunakan hubungan ini saat membuat kueri menggunakan notasi titik untuk mengakses properti hubungan dan menavigasi dari satu objek ke objek lainnya. Operasi akses ini diterjemahkan menjadi gabungan yang lebih kompleks atau subkueri terkait dalam SQL yang setara.

Misalnya, kueri berikut menavigasi dari pesanan ke pelanggan sebagai cara untuk membatasi hasil hanya untuk pesanan tersebut bagi pelanggan yang berada di London.

        Northwnd db = new Northwnd(@"northwnd.mdf");

        IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord

Jika properti hubungan tidak ada, Anda harus menulisnya secara manual sebagai joins, sebagaimana yang akan Anda lakukan dalam kueri SQL, seperti dalam kode berikut:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        IQueryable<Order> londonOrderQuery =
from cust in db.Customers
join ord in db.Orders on cust.CustomerID equals ord.CustomerID
where cust.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londOrderQuery = _
From cust In db.Customers _
Join ord In db.Orders On cust.CustomerID Equals ord.CustomerID _
Select ord

Anda dapat menggunakan properti relationship untuk mendefinisikan hubungan kustom ini satu kali. Anda kemudian dapat menggunakan sintaks titik yang lebih mudah. Namun, utamanya properti hubungan ada karena model objek khusus domain biasanya didefinisikan sebagai hierarki atau grafik. Objek yang Anda programkan memiliki referensi ke objek lain. Hubungan objek-ke-objek yang terkait dengan hubungan gaya kunci asing dalam database hanyalah kebetulan yang baik. Akses properti kemudian menyediakan cara mudah untuk menulis gabungan.

Sehubungan dengan hal ini, properti hubungan lebih penting di sisi hasil kueri daripada sebagai bagian dari kueri itu sendiri. Setelah kueri mengambil data tentang pelanggan tertentu, definisi kelas menunjukkan bahwa pelanggan memiliki pesanan. Dengan kata lain, Anda mengharapkan properti Orders dari pelanggan tertentu berupa kumpulan yang diisi dengan semua pesanan dari pelanggan tersebut. Ini sebenarnya kontrak yang Anda nyatakan dengan mendefinisikan kelas dengan cara ini. Anda berharap untuk melihat pesanan di sana meski kueri tidak meminta pesanan. Anda mengharapkan model objek untuk mempertahankan ilusi bahwa model ini adalah ekstensi dalam memori database dengan objek terkait yang langsung tersedia.

Sekarang setelah Anda memiliki hubungan, Anda dapat menulis kueri dengan merujuk ke properti hubungan yang ditentukan di kelas Anda. Referensi hubungan ini terkait dengan hubungan kunci asing dalam database. Operasi yang menggunakan hubungan ini diterjemahkan menjadi gabungan yang lebih kompleks dalam SQL yang setara. Selama Anda telah mendefinisikan hubungan (menggunakan atribut AssociationAttribute), Anda tidak perlu membuat kode gabungan eksplisit di LINQ to SQL.

Untuk membantu mempertahankan ilusi ini, LINQ to SQL mengimplementasikan teknik yang disebut dengan pemuatan yang ditunda. Untuk informasi selengkapnya, lihat Pemuatan Ditangguhkan versus Langsung.

Pertimbangkan kueri SQL berikut untuk memproyeksikan daftar pasangan CustomerID-OrderID:

SELECT t0.CustomerID, t1.OrderID  
FROM   Customers AS t0 INNER JOIN  
          Orders AS t1 ON t0.CustomerID = t1.CustomerID  
WHERE  (t0.City = @p0)  

Untuk mendapatkan hasil yang sama menggunakan LINQ to SQL, Anda menggunakan referensi properti Orders yang sudah ada di kelas Customer. Referensi Orders memberikan informasi yang diperlukan untuk menjalankan kueri dan memproyeksikan pasangan CustomerID-OrderID, seperti dalam kode berikut:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select new { cust.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select cust.CustomerID, ord.OrderID

Anda juga dapat melakukan sebaliknya. Artinya, Anda dapat membuat kueri Orders dan menggunakan referensi hubungan Customer untuk mengakses informasi tentang objek Customer terkait. Kode berikut memproyeksikan pasangan CustomerID-OrderID yang sama seperti sebelumnya, tetapi kali ini dengan membuat kueri Orders, alih-alih Customers.

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select new { ord.Customer.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord.CustomerID, ord.OrderID

Lihat juga