今天我的这个是一个奇怪的。
我在汇编方法中有这个查询。
public Order[] SelectAllOrders()
{
Order[] orders;
using (MyDataContext context = new MyDataContext())
{
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(order => order.OrderDetails);
context.LoadOptions = dlo;
orders = context.Orders.Select(p => p).ToArray();
}
return orders;
}
假设我已经调用了ToArray()执行的SQL命令并给了我需要的对象,我将它们提供给一个新的Order []数组,这不需要DataContext实例。 当我从方法返回序列化Order []时,序列化程序再次尝试访问DataContext,并且我得到一个无法访问已处置对象的异常。
在没有using()语句的情况下尝试并按照它应该的方式工作。但是,为什么我会这样做? 任何人都可以解释为什么在我调用.ToArray()并为内容分配新变量时仍然保留延迟加载?
答案 0 :(得分:1)
Select(p=>p)
实现的很少;你也可以打电话:
orders = context.Orders.ToArray();
重新解决问题 - 我猜想OrderDetails
没有真正加载,或者它试图懒洋洋地加载一些其他数据。我建议调查(在开发会议中):
Order[] orders;
using (MyDataContext context = new MyDataContext())
{
context.Log = Console.Out; // show me
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Order>(order => order.OrderDetails);
context.LoadOptions = dlo;
Console.WriteLine("> Calling ToArray");
orders = context.Orders.ToArray();
Console.WriteLine("> ToArray complete");
// TODO: your extra code that causes serialziation, probably
// involving `DataContractSerializer`
Console.WriteLine("> Calling Dispose");
}
有了这个,你应该能够看到任何额外的数据库旅行,在ToArray
{<1>}之后 之前。重点是:序列化需要这些数据,因此要么a:确保它被加载,要么b:将它从序列化中排除。