Запрос LINQ возвращает намного больше результатов, чем во всей базе данных - PullRequest
0 голосов
/ 02 февраля 2010

У меня следующий запрос LINQ. Проблема в том, что он возвращает результаты 13k, когда tblSurveys всего 20. Что я делаю не так?

from s in surveyContext.tblSurveys
from st in surveyContext.tblTypes_for_Surveys
from t in surveyContext.tblSurvey_Types
where (s.Survey_Date >= startDate && s.Survey_Date <= stopDate) && 
      (s.Unsubstantiated || 
         (st.SurveyID == s.SurveyID && st.SurveyTypeID == t.SurveyTypeID && 
         t.UnsubstantiatedAvailable && (from d in surveyContext.tblDeficiencies
                                         where d.SurveyID == s.SurveyID
                                        select d.DeficiencyID).Count() == 0))
orderby s.Survey_Date
select s;

Ответы [ 2 ]

5 голосов
/ 02 февраля 2010

Я вижу перекрестное соединение, посмотрите на <------- </p>

           from s in surveyContext.tblSurveys
           from st in surveyContext.tblTypes_for_Surveys
           from t in surveyContext.tblSurvey_Types
           where (s.Survey_Date >= startDate && s.Survey_Date <= stopDate) && 
                 (s.Unsubstantiated || <-------
                    (st.SurveyID == s.SurveyID && st.SurveyTypeID == t.SurveyTypeID && 
                    t.UnsubstantiatedAvailable && (from d in surveyContext.tblDeficiencies
                                                   where d.SurveyID == s.SurveyID
                                                   select d.DeficiencyID).Count() == 0))
           orderby s.Survey_Date
           select s;

похоже, вам нужно сделать левое соединение здесь

1 голос
/ 02 февраля 2010

У вас есть внешние ключи и настройки отношений в вашей базе данных?Если это так, вы можете значительно упростить свой запрос.Я также рекомендовал бы переименовать ваши таблицы в файле .dbml, чтобы не все они имели префикс «tbl».

Если у вас есть настройка отношений, ваш запрос может выглядеть (что-то) примерно так:

from s in surveyContext.tblSurveys
where (s.Survey_Date >= startDate && s.Survey_Date <= stopDate) && 
     (s.Unsubstantiated || 
        (s.tblTypes_for_Surveys.Any(st => st.tblSurvey_Type.UnsubstantiatedAvailable) && s.tblDeficiencies.Count() == 0))
orderby s.Survey_Date
select s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...