2011-10-06 88 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