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;
    }

现在测试完成,没有出现错误。

我的问题是为什么。这里缺少了什么?难道客户对象不应该像我期望的那样,与所有订单一起发送吗?

谢谢你的帮助!

WCF服务不返回linq-to-sql表的父记录和子记录

从内存来看,这是延迟加载的一部分。如果数据还没有被加载,那么它将不会仅仅为了序列化的目的而加载它(它使用序列化回调来知道数据是否被序列化)。如果您想要强制,那么只需迭代顺序。实际上,我怀疑您会发现只需添加这一行:

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;