如何:查询 EntityCollection 中的相关对象(实体框架)
本主题提供的示例演示如何查询由关系导航属性返回的 EntityCollection 中的相关对象。
本主题中的示例基于 Adventure Works 销售模型。 若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用实体框架 。 为此,请完成如何:手动配置实体框架项目和如何:手动定义模型和映射文件(实体框架)中的过程。 也可以使用实体数据模型向导定义 AdventureWorks 销售模型。 有关更多信息,请参见如何:使用实体数据模型向导(实体框架)。
示例
本示例加载与特定联系人相关的 SalesOrderHeader 对象集合,然后使用 LINQ 表达式返回已经发货的在线订单的列表。
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As New AdventureWorksEntities()
' Get a specified customer by contact ID.
Dim customer = (From customers In context.Contacts _
Where customers.ContactID = customerId _
Select customers).First()
' You do not have to call the Load method to load the orders for the customer,
' because lazy loading is set to true
' by the constructor of the AdventureWorksEntities object.
' With lazy loading set to true the related objects are loaded when
' you access the navigation property. In this case SalesOrderHeaders.
' Write the number of orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.", _
customer.LastName, customer.SalesOrderHeaders.Count)
' Get the online orders that have shipped.
Dim shippedOrders = From order In customer.SalesOrderHeaders _
Where order.OnlineOrderFlag = True AndAlso order.Status = 5 _
Select order
' Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.", shippedOrders.Count())
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
// Get a specified customer by contact ID.
var customer = (from customers in context.Contacts
where customers.ContactID == customerId
select customers).First();
// You do not have to call the Load method to load the orders for the customer,
// because lazy loading is set to true
// by the constructor of the AdventureWorksEntities object.
// With lazy loading set to true the related objects are loaded when
// you access the navigation property. In this case SalesOrderHeaders.
// Write the number of orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.",
customer.LastName, customer.SalesOrderHeaders.Count);
// Get the online orders that have shipped.
var shippedOrders =
from order in customer.SalesOrderHeaders
where order.OnlineOrderFlag == true
&& order.Status == 5
select order;
// Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.",
shippedOrders.Count());
}
本示例使用与针对 SalesOrderHeader 对象集合的第一个示例相同 LINQ 查询。 与最初将所有相关对象加载到集合不同,CreateSourceQuery 方法用于仅加载查询返回的对象。 然后在 SalesOrderHeader 关系导航属性返回的 EntityCollection 上调用 Load 方法,用于加载其他相关对象。
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As New AdventureWorksEntities()
' Get a specified customer by contact ID.
Dim customer = (From customers In context.Contacts
Where customers.ContactID = customerId
Select customers).First()
' Use CreateSourceQuery to generate a query that returns
' only the online orders that have shipped.
Dim shippedOrders = From orders In customer.SalesOrderHeaders.CreateSourceQuery() _
Where orders.OnlineOrderFlag = True AndAlso orders.Status = 5 _
Select orders
' Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.", shippedOrders.Count())
' You do not have to call the Load method to load the orders for the customer,
' because lazy loading is set to true
' by the constructor of the AdventureWorksEntities object.
' With lazy loading set to true the related objects are loaded when
' you access the navigation property. In this case SalesOrderHeaders.
' Write the number of total orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.", _
customer.LastName, customer.SalesOrderHeaders.Count)
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
// Get a specified customer by contact ID.
var customer = (from customers in context.Contacts
where customers.ContactID == customerId
select customers).First();
// Use CreateSourceQuery to generate a query that returns
// only the online orders that have shipped.
var shippedOrders =
from orders in customer.SalesOrderHeaders.CreateSourceQuery()
where orders.OnlineOrderFlag == true
&& orders.Status == 5
select orders;
// Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.",
shippedOrders.Count());
// You do not have to call the Load method to load the orders for the customer,
// because lazy loading is set to true
// by the constructor of the AdventureWorksEntities object.
// With lazy loading set to true the related objects are loaded when
// you access the navigation property. In this case SalesOrderHeaders.
// Write the number of total orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.",
customer.LastName, customer.SalesOrderHeaders.Count);
}
另请参见
任务
如何:执行返回实体类型对象的查询(实体框架)
如何:使用查询路径调整结果(实体框架)
如何:使用导航属性导航关系(实体框架)