不同的DataContext错误。为什么这是个问题?

时间:2010-01-21 20:54:45

标签: c# asp.net linq datacontext

以下代码导致“此查询包含对在不同数据上下文中定义的项目的引用”错误。我的2个数据上下文是使用围绕调用此方法的代码的2个嵌套使用块创建的,并在屏幕上显示其结果。此方法调用的方法仅使用传入其中的数据上下文,它们不会创建任何自己的方法。我已经通过在下面的方法中插入一个额外的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;
    }

3 个答案:

答案 0 :(得分:2)

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

LINQ to SQL推迟查询执行,直到枚举数据为止,因此如果混合使用datacontexts,它将如何使用SQL语句解析查询?它无法解决它。

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

答案 1 :(得分:0)

执行以下任一操作:

from surveys in surveysInState
from cSurveyor in currentSurveyors

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

感谢。

答案 2 :(得分:0)

我修好了。我仍然不明白我为什么遇到这个问题但是很好。

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