LINQ to SQL语句(17)之对象加载
系列文章导航:
LINQ to SQL语句(2)之Select/Distinct
LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg
LINQ to SQL语句(6)之Group By/Having
LINQ to SQL语句(7)之Exists/In/Any/All/Contains
LINQ to SQL语句(8)之Concat/Union/Intersect/Except
LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods
LINQ to SQL语句(12)之Delete和使用Attach
LINQ to SQL语句(14)之Null语义和DateTime
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
预先加载:LoadWith方法和Associate With方法
这个例子说明:使用LoadWith方法来确保在检索客户信息的同时检索订单信息,在检索订单信息的同时检索订单详细信息, 仅仅访问一次数据库。即可以在一个查询中检索许多对象。使用Associate With方法来限制订单详细信息的排序规则。
NorthwindDataContext db2 = new NorthwindDataContext(); DataLoadOptions ds = new DataLoadOptions(); ds.LoadWith<Customer>(p => p.Orders); ds.LoadWith<Order>(p => p.OrderDetails); ds.AssociateWith<Order>( p => p.OrderDetails.OrderBy(o => o.Quantity)); db2.LoadOptions = ds; var custs = ( from c in db2.Customers where c.City == "London" select c); foreach (var cust in custs) { foreach (var ord in cust.Orders) { foreach (var orderDetail in ord.OrderDetails) { //查询cust.CustomerID, ord.OrderID //orderDetail.ProductID, orderDetail.Quantity } } }
语句描述:在原始查询过程中使用 LoadWith 请求相关数据,以便稍后在检索到的各个对象中导航时此示例还说明在急切加载关系对象时可以使用 Assoicate With 对它们进行排序。
加载重写
这个例子在Category类里提供了一个LoadProducts分部方法。当产品的类别被加载的时候,就直接优先调用了LoadProducts方法来查询没有货源的产品。
private IEnumerable<Product> LoadProducts(Category category) { //在执行LINQ to SQL的时候,这个LoadProducts分部方法 //优先加载执行,这里用存储过程也可以. return this.Products .Where(p => p.CategoryID == category.CategoryID) .Where(p => !p.Discontinued); }
执行下面的查询时,利用上面方法返回的数据进行下面的操作:
NorthwindDataContext db2 = new NorthwindDataContext(); DataLoadOptions ds = new DataLoadOptions(); ds.LoadWith<Category>(p => p.Products); db2.LoadOptions = ds; var q = ( from c in db2.Categories where c.CategoryID < 3 select c); foreach (var cat in q) { foreach (var prod in cat.Products) { //查询cat.CategoryID, prod.ProductID } }
语句描述:重写 Category 类中的分部方法 LoadProducts。加载某种类别的产品时,调用 LoadProducts 以加载此类别中未停产的产品。
[第1页][第2页]