【问题标题】:How to tell if LinqToSql DataContext has previously returned results如何判断 LinqToSql DataContext 之前是否返回过结果
【发布时间】:2011-03-14 01:13:38
【问题描述】:

在 LinqToSql DataContext 上设置 LoadOptions 属性时,如果上下文已经从另一个查询返回结果,则抛出异常“从查询返回结果后不允许设置加载选项”。

我想知道的是,有没有办法检查 DataContext 对象以查看它是否已经返回了先前查询的结果?

【问题讨论】:

    标签: c# linq-to-sql datacontext loadoptions


    【解决方案1】:

    嗯,不是 DataContext 本身返回结果,而是一个查询。查询是延迟加载的,这意味着它们在实际需要结果之前不会访问数据库。例如,调用 .ToList(),或者循环遍历结果。

    仍然不能完全回答您的问题,但我建议在 DataContext 的构造函数中设置 LoadOptions - 或在实例化它之后立即设置。这应该可以消除谜团。

    【讨论】:

      【解决方案2】:

      您通常不会将 DataContext 保留足够长的时间来遇到此问题。该类被设计为在创建和销毁方面很便宜,因此您通常会为单个工作单元创建一个新的 DataContext 对象,然后将其处理掉。比如:

      using( var db = new TestDataContext() )
      {
          db.LoadOptions = CreateLoadOptions();
          var p = (from person in db.Persons
                   where <someCondition>
                   select p)
                   .First();
      
          p.SomeProperty = someValue;
          db.SubmitChanges();
      }   
      

      我知道从技术上讲这并不能回答您的问题,但我不知道有一种方法可以检查是否已在 DC 上执行查询,而无需在您自己的代码中设置标志。

      【讨论】:

      • 我会先尝试捕获异常,如果这不起作用,我会按照您的建议将工作单元分解成更小的部分,谢谢。
      • 如果您将 DataContext 保留太久,远非如此,这不是您可能遇到的唯一问题。您真的应该根据需要重构代码以创建这些上下文对象。
      【解决方案3】:

      我遇到了同样的问题....我发现避免异常的唯一方法(因为您甚至无法重置配置)是检查 LoadOptions 是否为空。如果它为空,我设置新选项,如果不是,我创建一个新的 DataContext 实例。

      【讨论】:

      • 我实际上已经在做空检查了。我认为发生的事情是,即使 LoadOptions 为空,在我的情况下,因为存储过程被称为第一个查询,异常仍然被抛出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多