WCF服务不返回linq-to-sql表的父记录和子记录
本文关键字:记录 服务 返回 linq-to-sql WCF | 更新日期: 2023-09-27 18:10:48
我正在编写一个wcf服务,使用linq到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;
}
现在测试完成,没有出现错误。
我的问题是为什么。这里缺少了什么?难道客户对象不应该像我期望的那样,与所有订单一起发送吗?
谢谢你的帮助!
从内存来看,这是延迟加载的一部分。如果数据还没有被加载,那么它将不会仅仅为了序列化的目的而加载它(它使用序列化回调来知道数据是否被序列化)。如果您想要强制,那么只需迭代顺序。实际上,我怀疑您会发现只需添加这一行:
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;