2011-10-06 90 views
1

我正在寫一個wcf服務,使用linq to sql datacontext來執行數據庫操作。wcf服務不返回linq-to-sql表的父和子記錄?

有一個客戶和訂單的記錄,一種方法需要通過ID如下

public customer Customer_Get_By_Session_Id(string session_id) { 

     //check valid session_id 
     //... 

     //if session_id exists, get customer info 
     var saved_customer = (from p in db.customers 
           where p.session_id == session_id 
           select p).FirstOrDefault(); 

     return saved_customer; 
    } 

但是它只返回單個客戶沒有任何訂單,從我的測試方法調用時返回特定的客戶。

[TestMethod] 
    public void CustomerGetByid() 
    { 

     dataclassesDataContext db = new dataclassesDataContext(); 
     var mycust = db.partner_svc_customers.FirstOrDefault(); 

     var saved_customer = svc_wcf.Customer_Get_By_Session_Id(mycust.session_id); 

     //fails! saved_customer.orders.Count() == 0 
     Assert.IsTrue(saved_customer.orders.Count() == 1); 


    } 

我可以通過修改我的方法手動將訂單添加到另一位客戶return_customer並返回該對象來解決此問題。

public customer Customer_Get_By_Session_Id(string session_id) { 

     //check valid session_id 
     //... 

     //if session_id exists, get customer info 
     var saved_customer = (from p in db.customers 
           where p.session_id == session_id 
           select p).FirstOrDefault(); 


     var orders = saved_customer.orders.ToList(); 

     customer return_customer = new customer(); 
     return_customer = saved_customer; 

     foreach (order my_order in orders) 
     { 
      returned_customer.orders.Add(my_order); 
     } 
     return returned_customer; 
    } 

現在測試完成而沒有出現錯誤。

我的問題是爲什麼。這裏缺少什麼?客戶對象是否不應該像所期望的那樣被所有的訂單發送出去?

感謝您的幫助!

回答

1

從內存中,這是延遲加載的一部分。如果數據沒有被加載,那麼它不會加載它簡單地進行序列化的目的(它使用序列化回調知道它是否正在連載)。如果你想強制它,那麼只需迭代訂單。其實,我懷疑你會發現,簡單地加入這一行:

var orders = saved_customer.orders.ToList(); 

是什麼使得它的工作,因爲這迫使它加載數據,即

var saved_customer = (from p in db.customers 
         where p.session_id == session_id 
         select p).FirstOrDefault(); 

var orders = saved_customer.orders.ToList(); // voodoo to make orders load 
return saved_customer; 
+0

奏效!謝謝。我也讀了類似的問題,並試圖這種方法http://codeexperiment.com/post/Returning-LINQ-to-SQL-Entities-From-WCF.aspx whree設置DataLoadOptions和dlo.LoadWith (E =>即命令);在查詢之前,它做了訣竅。 – kiev