How to: Use Multiple Fetch Definitions

When you use the LoadWith method, it is not allowed to specify the loading of two levels of relationships (e.g, Orders.OrderDetails). In these scenarios you must specify two separate LoadWith methods.

In the following example, all the Orders and OrderDetails for all the Customers who are located in Germany are retrieved when the query is executed. As a result, successive access to the Orders property on a Customer object does not trigger a new database query.


    using (NorthwindDbContext dbContext = new NorthwindDbContext())
       Telerik.OpenAccess.FetchOptimization.FetchStrategy fetchStrategy = new Telerik.OpenAccess.FetchOptimization.FetchStrategy();
       fetchStrategy.LoadWith<Customer>(c => c.Orders);
       fetchStrategy.LoadWith<Order>(o => o.OrderDetails);

       dbContext.FetchStrategy = fetchStrategy;

       IQueryable<Customer> query = from c in dbContext.Customers
                                       where c.Country == "Germany"
                                       select c;

       foreach (Customer customer in query)
           Console.WriteLine("Customer Id: {0}", customer.CustomerID);
           foreach (Order order in customer.Orders)
               Console.WriteLine("===Order date: {0}", order.OrderDate.ToString());
               foreach (OrderDetail orderDetail in order.OrderDetails)
                   Console.WriteLine("======Unit price: {0}", orderDetail.UnitPrice.ToString("c"));


    Using dbContext As New NorthwindDbContext()
     Dim fetchStrategy As New Telerik.OpenAccess.FetchOptimization.FetchStrategy()
     fetchStrategy.LoadWith(Of Customer)(Function(c) c.Orders)
     fetchStrategy.LoadWith(Of Order)(Function(o) o.OrderDetails)

     dbContext.FetchStrategy = fetchStrategy

     Dim query As IQueryable(Of Customer) = From c In dbContext.Customers
                                            Where c.Country = "Germany"
                                            Select c

     For Each customer_Renamed As Customer In query
      Console.WriteLine("Customer Id: {0}", customer_Renamed.CustomerID)
      For Each order_Renamed As Order In customer_Renamed.Orders
       Console.WriteLine("===Order date: {0}", order_Renamed.OrderDate.ToString())
       For Each orderDetail_Renamed As OrderDetail In order_Renamed.OrderDetails
        Console.WriteLine("======Unit price: {0}", orderDetail_Renamed.UnitPrice.ToString("c"))
       Next orderDetail_Renamed
      Next order_Renamed
     Next customer_Renamed
    End Using

Alternatively, you can use the second overload of the LoadWith<T> method, accepting an array of expression in the following manner.


    fetchStrategy.LoadWith<Order>(c => c.OrderDetails, c => c.Customer);


    fetchStrategy.LoadWith(Of Order)(Function(c) c.OrderDetails, Function(c) c.Customer)

See Also