2010-01-21 2 views
3

Следующий код вызывает ошибку «Этот запрос содержит ссылки на элементы, определенные в другом контексте данных». Мои 2 контекста данных создаются с использованием 2 вложенных блоков использования кода, который вызывает этот метод, и отображает его результаты на экране. Методы, которые этот метод вызывает, используют только используемый им контекст данных, они не создают никаких своих собственных. Я подтвердил, что они в порядке, вставив дополнительный оператор возврата прямо перед тем, как описано ниже, и у меня нет никаких проблем, что заставляет меня думать, что проблема заключается в инструкции LINQ на обратной линии ... Что я делаю неправильно?Другая ошибка DataContext. Почему это проблема?

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

ответ

2

Вы смешиваете различные DataContex в одном запросе, вот в чем проблема.

LINQ to SQL отложить выполнение запроса до тех пор, пока данные не будут перечислены, поэтому, если вы смешаете datacontexts, как бы он разрешил запрос с помощью инструкции SQL? Он не может его решить.

Возможное решение состоит в том, чтобы иметь все связанные данные в одном и том же тексте данных или вы могли бы перечислять данные и смешивать их позже.

0

Выполните одно из них:

from surveys in surveysInState 
from cSurveyor in currentSurveyors 

Приходите с FINDataContext или включать его вообще? Это может быть проблемой. Или, если вы выполняете назначение из объекта из этого другого контекста данных вообще. Кроме того, контекст данных имеет свойство Log; присоединить регистратор к этому свойству и изучить SQL, который он генерирует, что может дать вам некоторые подсказки.

Спасибо.

+0

from surveys in surveysInState происходит из SurveyDataContext и FINDataContext, from cSurveyor in currentSurveyors происходит из SurveyDataContext. Однако оба используются один и тот же экземпляр surveyContext/finContext, и эти контексты являются живыми для полного доступа к этому вызову и когда данные записываются на экран. – jamone

+0

Эй, вы не можете смешивать объекты контекста в своих запросах. Несмотря на то, что вы не получили ошибку, ошибка LINQ не возникает сразу; это происходит, когда вы пытаетесь запросить его, повторите его или вызовите метод LINQ (например, Count()). Таким образом, вы можете иметь запрос выше, возвращать результат в опросникInState и не генерировать ошибку при его запросе, но как только вы ее касаетесь, возникает исключение (потому что внутренняя коллекция не оценивается до тех пор, пока вы ее не коснетесь) , –

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; 
    } 
Смежные вопросы