学习Linq时,经常会遇到Linq调用LoadProducts方法问题,这里将介绍Linq调用LoadProducts方法问题的解决方法。
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 对它们进行排序。
Linq调用LoadProducts方法
这个例子在Category类里提供了一个LoadProducts分部方法。当产品的类别被加载的时候,就直接优先Linq调用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。加载某种类别的产品时,Linq调用LoadProducts方法以加载此类别中未停产的产品。
【编辑推荐】