以下代码导致“此查询包含对在不同数据上下文中定义的项目的引用”错误。我的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;
}
答案 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;
}