Contoh Sintaks Kueri Berbasis Metode: Menavigasikan Hubungan
Properti navigasi dalam Kerangka Kerja Entitas adalah properti pintasan yang digunakan untuk menemukan entitas di akhir asosiasi. Properti navigasi memungkinkan pengguna untuk menavigasi dari satu entitas ke entitas lain, atau dari satu entitas ke entitas terkait melalui kumpulan asosiasi. Topik ini memberikan contoh dalam sintaks kueri berbasis metode tentang cara menavigasi hubungan melalui properti navigasi di kueri LINQ ke Entitas.
Model Penjualan AdventureWorks yang digunakan dalam contoh ini dibuat dari tabel Kontak, Alamat, Produk, SalesOrderHeader, dan SalesOrderDetail dalam database sampel AdventureWorks.
Contoh dalam topik ini menggunakan pernyataan using
/Imports
berikut:
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Globalization;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Data.Common;
Option Explicit On
Option Strict On
Imports System.Data.Objects
Imports System.Globalization
Contoh 1
Contoh berikut dalam sintaks kueri berbasis metode menggunakan metode SelectMany untuk mendapatkan semua urutan kontak yang nama belakangnya adalah "Zhou". Properti navigasi Contact.SalesOrderHeader
digunakan untuk mendapatkan kumpulan objek SalesOrderHeader
untuk setiap kontak.
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.SelectMany(c => c.SalesOrderHeaders);
foreach (var order in ordersQuery)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
order.SalesOrderID, order.OrderDate, order.TotalDue);
}
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.SelectMany(Function(o) o.SalesOrderHeaders)
For Each order In ordersQuery
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
order.SalesOrderID, order.OrderDate, order.TotalDue)
Next
End Using
Contoh 2
Contoh berikut dalam sintaks kueri berbasis metode menggunakan metode Select untuk mendapatkan semua ID kontak dan menjumlahkan total yang harus dibayar untuk setiap kontak yang nama belakangnya adalah "Zhou". Properti navigasi Contact.SalesOrderHeader
digunakan untuk mendapatkan kumpulan objek SalesOrderHeader
untuk setiap kontak. Metode Sum
menggunakan properti navigasi Contact.SalesOrderHeader
untuk menjumlahkan total semua pesanan untuk setiap kontak.
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.Select(c => new
{
ContactID = c.ContactID,
Total = c.SalesOrderHeaders.Sum(o => o.TotalDue)
});
foreach (var contact in ordersQuery)
{
Console.WriteLine("Contact ID: {0} Orders total: {1}", contact.ContactID, contact.Total);
}
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.Select(Function(c) New With _
{.ContactID = c.ContactID, _
.Total = c.SalesOrderHeaders.Sum(Function(o) o.TotalDue)})
For Each order In ordersQuery
Console.WriteLine("Contact ID: {0} Orders total: {1}", order.ContactID, order.Total)
Next
End Using
Contoh 3
Contoh berikut dalam sintaks kueri berbasis metode mendapatkan semua pesanan kontak yang nama belakangnya adalah "Zhou". Properti navigasi Contact.SalesOrderHeader
digunakan untuk mendapatkan kumpulan objek SalesOrderHeader
untuk setiap kontak. Nama kontak dan pesanan ditampilkan dalam jenis anonim.
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.Select(c => new { LastName = c.LastName, Orders = c.SalesOrderHeaders });
foreach (var order in ordersQuery)
{
Console.WriteLine("Name: {0}", order.LastName);
foreach (SalesOrderHeader orderInfo in order.Orders)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue);
}
Console.WriteLine("");
}
}
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.Select(Function(o) New With _
{.LastName = o.LastName, _
.Orders = o.SalesOrderHeaders})
For Each order In ordersQuery
Console.WriteLine("Name: {0}", order.LastName)
For Each orderInfo In order.Orders
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue)
Next
Console.WriteLine("")
Next
End Using
Contoh 4
Contoh berikut menggunakan properti navigasi SalesOrderHeader.Address
dan SalesOrderHeader.Contact
untuk mendapatkan kumpulan objek Address
dan Contact
yang terkait dengan setiap pesanan. Nama belakang kontak, alamat jalan, nomor pesanan penjualan, dan jumlah total yang harus dibayar untuk setiap pesanan ke kota Seattle ditampilkan dalam jenis anonim.
string city = "Seattle";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.SalesOrderHeaders
.Where(o => o.Address.City == city)
.Select(o => new
{
ContactLastName = o.Contact.LastName,
ContactFirstName = o.Contact.FirstName,
StreetAddress = o.Address.AddressLine1,
OrderNumber = o.SalesOrderNumber,
TotalDue = o.TotalDue
});
foreach (var orderInfo in ordersQuery)
{
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName);
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress);
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber);
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue);
Console.WriteLine("");
}
}
Dim city = "Seattle"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.SalesOrderHeaders _
.Where(Function(o) o.Address.City = city) _
.Select(Function(o) New With { _
.ContactLastName = o.Contact.LastName, _
.ContactFirstName = o.Contact.FirstName, _
.StreetAddress = o.Address.AddressLine1, _
.OrderNumber = o.SalesOrderNumber, _
.TotalDue = o.TotalDue _
})
For Each orderInfo In ordersQuery
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName)
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress)
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber)
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue)
Console.WriteLine("")
Next
End Using
Contoh 5
Contoh berikut menggunakan metode Where
untuk menemukan pesanan yang dibuat setelah 1 Desember 2003, lalu menggunakan properti navigasi order.SalesOrderDetail
untuk mendapatkan detail setiap pesanan.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> query =
from order in context.SalesOrderHeaders
where order.OrderDate >= new DateTime(2003, 12, 1)
select order;
Console.WriteLine("Orders that were made after December 1, 2003:");
foreach (SalesOrderHeader order in query)
{
Console.WriteLine("OrderID {0} Order date: {1:d} ",
order.SalesOrderID, order.OrderDate);
foreach (SalesOrderDetail orderDetail in order.SalesOrderDetails)
{
Console.WriteLine(" Product ID: {0} Unit Price {1}",
orderDetail.ProductID, orderDetail.UnitPrice);
}
}
}
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
Dim query = _
From order In orders _
Where order.OrderDate >= New DateTime(2003, 12, 1) _
Select order
Console.WriteLine("Orders that were made after December 1, 2003:")
For Each order In query
Console.WriteLine("OrderID {0} Order date: {1:d} ", _
order.SalesOrderID, order.OrderDate)
For Each orderDetail In order.SalesOrderDetails
Console.WriteLine(" Product ID: {0} Unit Price {1}", _
orderDetail.ProductID, orderDetail.UnitPrice)
Next
Next
End Using