Linq to sql LINQ 2 SQL查询ObjectDisposed异常

Linq to sql LINQ 2 SQL查询ObjectDisposed异常,linq-to-sql,c#-3.0,Linq To Sql,C# 3.0,我今天吃的这个很奇怪 我在汇编方法中有此查询 public Order[] SelectAllOrders() { Order[] orders; using (MyDataContext context = new MyDataContext()) { DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith<O

我今天吃的这个很奇怪

我在汇编方法中有此查询

        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;
    }
public Order[]SelectAllOrders()
{
订单[]份订单;
使用(MyDataContext=newmydatacontext())
{
DataLoadOptions dlo=新的DataLoadOptions();
dlo.LoadWith(order=>order.OrderDetails);
context.LoadOptions=dlo;
orders=context.orders.Select(p=>p.ToArray();
}
退货订单;
}
假设我已经调用了ToArray(),执行了SQL命令并给了我所需的对象,然后我将它们交给了一个新的Order[]数组,这不需要DataContext实例。 当我序列化从方法return获得的订单[]时,序列化程序再次尝试访问DataContext,我得到一个无法访问已释放对象的异常

在不使用using()语句的情况下进行了尝试,并正常工作。但是,为什么我会有这种行为? 任何人都可以解释为什么在我调用.ToArray()并为新变量分配内容时,延迟加载仍然保留?

选择(p=>p)的效果很小;你不妨打电话:

orders = context.Orders.ToArray();
这就是问题所在-我猜要么是
OrderDetails
没有真正加载,要么是它试图延迟加载其他数据。我建议(在开发会议中)进行调查:

Order[]订单;
使用(MyDataContext=newmydatacontext())
{
context.Log=Console.Out;//演示
DataLoadOptions dlo=新的DataLoadOptions();
dlo.LoadWith(order=>order.OrderDetails);
context.LoadOptions=dlo;
Console.WriteLine(“>调用ToArray”);
orders=context.orders.ToArray();
控制台。写入线(“>ToArray complete”);
//TODO:您的额外代码可能会导致序列化
//涉及` DataContractSerializer`
Console.WriteLine(“>调用Dispose”);
}
这样,您应该能够看到在
ToArray
之后但在
Dispose()
之前发生的任何额外数据库访问。要点是:序列化需要此数据,因此a:确保加载它,或b:将其从序列化中排除。

选择(p=>p)的效果很小;你不妨打电话:

orders = context.Orders.ToArray();
这就是问题所在-我猜要么是
OrderDetails
没有真正加载,要么是它试图延迟加载其他数据。我建议(在开发会议中)进行调查:

Order[]订单;
使用(MyDataContext=newmydatacontext())
{
context.Log=Console.Out;//演示
DataLoadOptions dlo=新的DataLoadOptions();
dlo.LoadWith(order=>order.OrderDetails);
context.LoadOptions=dlo;
Console.WriteLine(“>调用ToArray”);
orders=context.orders.ToArray();
控制台。写入线(“>ToArray complete”);
//TODO:您的额外代码可能会导致序列化
//涉及` DataContractSerializer`
Console.WriteLine(“>调用Dispose”);
}

这样,您应该能够看到在
ToArray
之后但在
Dispose()
之前发生的任何额外数据库访问。要点是:序列化需要这些数据,所以a:确保加载它,或b:将其从序列化中排除。

Marc,thanx为了回答,我不记得如何在输出窗口中显示SQL查询以避免控制台项目测试,但尚未找到它:p,创建了控制台,你说得对,我忘了关联OrderDetails 1-*产品。答案是LoadWith(od=>od.Product)和它的所有优点。谢谢你…Marc,thanx的回答,我不记得如何在输出窗口中显示SQL查询以避免控制台项目测试,但找不到它:P.所以,创建了控制台,你说得对,我忘了关联OrderDetails 1-*产品。答案是LoadWith(od=>od.Product)和它的所有优点。非常感谢。