【问题标题】:Different DataContext error. Why is this a problem?不同的 DataContext 错误。为什么这是个问题?
【发布时间】:2011-01-07 22:37:11
【问题描述】:

以下代码导致“此查询包含对在不同数据上下文中定义的项目的引用”错误。我的 2 个数据上下文是用 2 个嵌套 using 块围绕调用此方法并在屏幕上显示其结果的代码创建的。此方法调用的方法仅使用传递给它们的数据上下文,它们不会创建自己的任何方法。我已经通过在下面方法中的语句之前插入一个额外的 return 语句来验证它们没有问题,我没有遇到任何问题,这让我相信问题出在 return 行上的 LINQ 语句中......什么我做错了吗?

public static IQueryable<tblSurveyor> GetPossibleSurveyorsForSurvey(SurveyDataContext surveyContext,
        FINDataContext finContext, int surveyID)
    {
        IQueryable<tblSurveyor> currentSurveyors = 
            GetSurveyorsForSurvey(surveyContext, surveyID);

        tblSurvey currentSurvey = GetSurvey(surveyContext, surveyID);

        tblLocContact facility = GetFacility(finContext, currentSurvey.FacilityID);

        IQueryable<tblSurvey> surveysInState = GetSurveysInState(surveyContext, finContext,
            facility.State);

        return from task in surveyContext.tblSurveyor_Tasks
               from surveys in surveysInState
               from cSurveyor in currentSurveyors
               from surveyors in surveyContext.tblSurveyors
               where surveyors.SurveyorID != cSurveyor.SurveyorID &&
               surveys.SurveyID == task.SurveyID &&
               task.SurveyorID == surveyors.SurveyorID
               select surveyors;
    }

我改变了一些东西,最值得注意的是我去掉了 IQueryable 变量并将它们变成了数组。这主要是为了在我去的时候强制枚举。这表明问题(或该方法中的至少一个问题)。

tblSurvey[] surveysInState = GetSurveysInState(surveyContext, finContext,
            state).ToArray();

这是该方法的实现。我仍然没有看到它的问题。

public static IQueryable<tblSurvey> GetSurveysInState(SurveyDataContext surveyContext,
        FINDataContext finContext, string state)
    {
        return from survey in surveyContext.tblSurveys
               from facility in finContext.tblLocContacts
               where survey.FacilityID == facility.LocationID && facility.State == state
               select survey;
    }

【问题讨论】:

    标签: c# asp.net linq datacontext


    【解决方案1】:

    您在同一个查询中混合了各种 DataContex,这就是问题所在。

    LINQ to SQL 将查询执行推迟到枚举数据,所以如果您混合数据上下文,它将如何使用 SQL 语句解析查询?解决不了。

    一种可能的解决方案是将所有相关数据放在同一个数据上下文中,或者您可以枚举数据并稍后混合。

    【讨论】:

      【解决方案2】:

      执行以下任一操作:

      from surveys in surveysInState
      from cSurveyor in currentSurveyors
      

      来自 FINDataContext 还是完全涉及它?那可能是个问题。或者,如果您完全从这个其他数据上下文中的对象进行分配。此外,数据上下文有一个 Log 属性;将记录器附加到该属性,并检查它生成的 SQL,这可能会给您一些线索。

      谢谢。

      【讨论】:

      • fromsurveysInState来自SurveyDataContext和FINDataContext,from cSurveyor in currentSurveyors来自SurveyDataContext。然而,两者都使用了同一个surveyContext/finContext 实例,并且这些上下文在此调用的整个访问过程中以及数据写入屏幕时都处于活动状态。
      • 嘿,您不能在查询中混合上下文对象。即使您没有收到错误,也不会立即发生 LINQ 错误;当您尝试对其进行查询、迭代或调用 LINQ 方法(例如 Count())时,就会发生这种情况。因此,您可以让上面的查询将结果返回到surveysInState,并且在查询时不会生成错误,但是一旦您触摸它,就会引发异常(因为在您触摸它之前不会评估内部集合) .
      【解决方案3】:

      我修好了。我仍然不明白为什么我会遇到问题,但是哦,好吧。

      public static IQueryable<tblSurvey> GetSurveysInState(SurveyDataContext surveyContext,
              FINDataContext finContext, string state)
          {
              string[] facility = (from f in finContext.tblLocContacts
                             where f.State == state
                             select f.LocationID).ToArray();
      
              return from survey in surveyContext.tblSurveys
                     where facility.Contains(survey.FacilityID)
                     select survey;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-18
        • 2015-06-13
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        相关资源
        最近更新 更多