2009-11-05 68 views
0

我知道在從LINQ-to-SQL類獲取數據時使用using塊是一種很好的做法,如下所示。在方法中處理DataContext的最佳LINQ-to-SQL策略是什麼?

然而,我這樣做時,我只能因爲它們似乎在這一點上設置的訪問的orders(例如Order.OrderId),但不更深性質(例如Customer.CustomerName)淺性質。

我可以拿出我的using塊,它允許我訪問客戶,但是這不會釋放資源。

這裏的最佳做法是什麼?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using TestExtn2343.Models; 

namespace TestExtn2343 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 

      var orders = GetOrders(10, 10); 

      orders.ForEach(x => 
      { 
       Customer customer = x.Customer; 
       if (customer != null) 
       { 
        //SUCCEEDS: 
        Console.WriteLine("{0}, {1}", x.OrderID); 

        //FAILS: " 
        Console.WriteLine("{0}, {1}", x.OrderID, x.Customer.ContactName.ToString()); 
       } 
      }); 

      Console.ReadLine(); 
     } 

     public static List<Order> GetOrders(int skip, int take) 
     { 
      using (MainDataContext db = new MainDataContext()) 
      { 
       List<Order> orders = (from order in db.Orders 
             select order).Skip(skip).Take(take).ToList(); 
       return orders; 
      } 
     } 

    } 
} 

答:

感謝亞當,用你的建議,我有我的代碼工作是這樣的:

public static void Main(string[] args) 
{ 
    using (MainDataContext db = new MainDataContext()) 
    { 
     GetOrders(db, 10, 10).ForEach(x => Console.WriteLine("{0}, {1}", x.OrderID, x.Customer.ContactName.ToString())); 
    } 
    Console.ReadLine(); 
} 

public static List<Order> GetOrders(MainDataContext db, int skip, int take) 
{ 
    List<Order> orders = (from order in db.Orders 
          select order).Skip(skip).Take(take).ToList(); 
    return orders; 
} 

回答

4

對象的更深層次的性能不能訪問,因爲LINQ到SQL使用延遲加載(即,它會自動獲取這些記錄需要,所以當你首次訪問它們時會執行數據庫操作)。由於DataContext被丟棄,因此無法執行必要的數據庫操作。這種屬性可能會「熱切」地加載(意思是在初始檢索時),但您必須事先了解所有這些。

在一般情況下,你的DataContext應該住你的工作單位的時間,所以在這裏出現,你DataContext需要這種方法之外聲明,並通過了(或者甚至宣稱作爲擴展方法你DataContext)。

這是一個很好的blog postDataContext生命週期管理。

1

如果你知道一個事實,你會想獲得客戶,您可以在DataLoadOptions中指定它,並且它將連接請求以急切加載它們而不是延遲加載它們。

這是msdn article on DataLoadOptions

例子:

var dlo = new DataLoadOptions(); 
dlo.LoadWith<Order>(o => o.Customer); 
context.DataLoadOptions = dlo; 
相關問題