Другая ошибка DataContext. Почему это проблема? - PullRequest
3 голосов
/ 21 января 2010

Следующий код вызывает ошибку «Этот запрос содержит ссылки на элементы, определенные в другом контексте данных». Мои 2 контекста данных создаются с двумя вложенными элементами, используя блоки вокруг кода, который вызывает этот метод и отображает результаты на экране. Методы, которые вызывает этот метод, используют только передаваемый им контекст данных, они не создают своих собственных. Я проверил, что они в порядке, вставив дополнительный оператор возврата прямо перед тем, как в методе ниже, и у меня не возникло никаких проблем, что заставляет меня поверить, что проблема в операторе 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 ]

2 голосов
/ 22 января 2010

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

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

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

0 голосов
/ 22 января 2010

Я исправил это. Я до сих пор не понимаю, почему у меня возникла проблема, ну да ладно.

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;
    }
0 голосов
/ 22 января 2010

Выполните одно из следующих действий:

from surveys in surveysInState
from cSurveyor in currentSurveyors

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

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...