Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Entity Framework'teki gezinti özellikleri, ilişkilendirmenin sonundaki varlıkları bulmak için kullanılan kısayol özellikleridir. Gezinti özellikleri, kullanıcının bir varlıktan diğerine veya bir varlıktan ilişkilendirme kümesi aracılığıyla ilgili varlıklara gitmesine olanak tanır. Bu konu başlığında, LINQ to Entities sorgularındaki gezinti özellikleri aracılığıyla ilişkilerde gezinmeye yönelik yöntem tabanlı sorgu söz diziminde örnekler sağlanır.
Bu örneklerde kullanılan AdventureWorks Satış Modeli, AdventureWorks örnek veritabanındaki Contact, Address, Product, SalesOrderHeader ve SalesOrderDetail tablolarından oluşturulur.
Bu konudaki örneklerde aşağıdaki using/Imports deyimleri kullanılır:
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
Örnek 1
Yöntem tabanlı sorgu söz dizimindeki aşağıdaki örnek, soyadı "Zhou" olan kişilerin tüm siparişlerini almak için SelectMany yöntemini kullanır.
Contact.SalesOrderHeader gezinme özelliği, her bir kişi için SalesOrderHeader nesneleri koleksiyonunu almak için kullanılır.
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
Örnek 2
Yöntem tabanlı sorgu söz diziminde yer alan aşağıdaki örnek, soyadı "Zhou" olan her kişi için tüm kişi kimliklerini ve toplam borcun toplamını almak üzere Select yöntemini kullanır.
Contact.SalesOrderHeader gezinme özelliği, her bir kişi için SalesOrderHeader nesneleri koleksiyonunu almak için kullanılır.
Sum yöntemi, her bir kişinin tüm siparişlerinin ödenmesi gereken toplamını hesaplamak için Contact.SalesOrderHeader gezinti özelliğini kullanır.
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: {contact.ContactID} Orders total: {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
Örnek 3
Yöntem tabanlı sorgu söz dizimindeki aşağıdaki örnek, soyadı "Zhou" olan kişilerin tüm siparişlerini alır.
Contact.SalesOrderHeader gezinme özelliği, her bir kişi için SalesOrderHeader nesneleri koleksiyonunu almak için kullanılır. İletişim kişisinin adı ve siparişleri anonim bir türde döndürülür.
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: {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
Örnek 4
Aşağıdaki örnekte SalesOrderHeader.Address ve SalesOrderHeader.Contact gezinti özellikleri Address ve her bir sırayla ilişkili Contact nesnelerinin koleksiyonunu elde etmek için kullanılır. İlgili kişinin soyadı, sokak adresi, satış siparişi numarası ve Seattle şehrindeki her siparişin toplam borç tutarı adsız bir türde döndürülür.
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: {orderInfo.StreetAddress}");
Console.WriteLine($"Order number: {orderInfo.OrderNumber}");
Console.WriteLine($"Total Due: {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
Örnek 5
Aşağıdaki örnek, 1 Aralık 2003'te yapılan siparişleri bulmak için Where yöntemini kullanır ve ardından her siparişin ayrıntılarını almak için order.SalesOrderDetail gezinti özelliğini kullanır.
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 {order.SalesOrderID} Order date: {order.OrderDate:d} ");
foreach (SalesOrderDetail orderDetail in order.SalesOrderDetails)
{
Console.WriteLine($" Product ID: {orderDetail.ProductID} Unit Price {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