Bagikan melalui


Kueri Lintas-Tabel (LINQ ke DataSet)

Selain kueri satu tabel, Anda juga bisa melakukan kueri lintas tabel di LINQ ke DataSet. Cara ini dilakukan dengan menggunakan join. Penggabungan adalah asosiasi objek dalam satu sumber data dengan objek yang memiliki atribut yang sama di sumber data lain, seperti ID produk atau kontak. Dalam pemrograman berorientasi objek, hubungan antar objek relatif mudah dinavigasi karena setiap objek memiliki anggota yang mereferensikan objek lain. Namun, dalam tabel database eksternal, menavigasi hubungan tidak semudah itu. Tabel database tidak berisi hubungan bawaan. Dalam kasus ini, operasi gabungan dapat digunakan untuk mencocokkan elemen dari setiap sumber. Misalnya, dengan dua tabel yang berisi informasi produk dan informasi penjualan, Anda dapat menggunakan operasi gabungan untuk mencocokkan informasi penjualan dan produk untuk pesanan penjualan yang sama.

Kerangka kerja Kueri Terintegrasi Bahasa (LINQ) menyediakan dua operator gabungan, Join dan GroupJoin. Operator ini melakukan penggabungan setara: yaitu, penggabungan yang mencocokkan dua sumber data hanya ketika kuncinya sama. (Sebaliknya, Transact-SQL mendukung operator gabungan selain equals, seperti operator less than.)

Dalam istilah basis data relasional, Join mengimplementasikan gabungan dalam. Gabungan dalam adalah jenis penggabungan yang objek-objeknya saja yang memiliki kecocokan dalam kumpulan data berlawanan yang dikembalikan.

Operator GroupJoin tidak memiliki padanan langsung dalam istilah basis data relasional, operator tersebut menerapkan superset gabungan dalam dan gabungan luar kiri. Gabungan luar kiri adalah gabungan yang mengembalikan setiap elemen dari koleksi pertama (kiri), meskipun tidak memiliki elemen yang berkorelasi di koleksi kedua.

Untuk informasi selengkapnya tentang bergabung, baca Operasi Gabungan.

Contoh

Contoh berikut melakukan penggabungan tradisional tabel SalesOrderHeader dan SalesOrderDetail dari database sampel AdventureWorks untuk mendapatkan pesanan online dari bulan Agustus.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];

var query =
    from order in orders.AsEnumerable()
    join detail in details.AsEnumerable()
    on order.Field<int>("SalesOrderID") equals
        detail.Field<int>("SalesOrderID")
    where order.Field<bool>("OnlineOrderFlag") == true
    && order.Field<DateTime>("OrderDate").Month == 8
    select new
    {
        SalesOrderID =
            order.Field<int>("SalesOrderID"),
        SalesOrderDetailID =
            detail.Field<int>("SalesOrderDetailID"),
        OrderDate =
            order.Field<DateTime>("OrderDate"),
        ProductID =
            detail.Field<int>("ProductID")
    };

foreach (var order in query)
{
    Console.WriteLine("{0}\t{1}\t{2:d}\t{3}",
        order.SalesOrderID,
        order.SalesOrderDetailID,
        order.OrderDate,
        order.ProductID);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
    From order In orders.AsEnumerable() _
    Join detail In details.AsEnumerable() _
    On order.Field(Of Integer)("SalesOrderID") Equals _
            detail.Field(Of Integer)("SalesOrderID") _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
            order.Field(Of DateTime)("OrderDate").Month = 8 _
    Select New With _
    { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .ProductID = detail.Field(Of Integer)("ProductID") _
    }

For Each order In query
    Console.WriteLine(order.SalesOrderID & vbTab & _
        order.SalesOrderDetailID & vbTab & _
        order.OrderDate & vbTab & _
        order.ProductID)
Next

Lihat juga