2010-02-02 3 views
0

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

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

У вас есть внешние ключи и настройки отношений в вашей базе данных? Если это так, вы можете значительно упростить свой запрос. Я также рекомендовал бы переименовать ваши таблицы в файле .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; 
+0

Ух, и я думал, что LINQ-SQL был мощным раньше. Отлично. Это просто сделало много моих вещей проще, зная, что внешние ключи/отношения обрабатывают это для вас. – jamone

5

Я могу видеть перекрестное соединение там, смотреть на < -------

  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

почему downvote? – Fredou

+0

Я не вижу, что плохого в крест-соединении. (Просто пришлось посмотреть его) (я не голосовал). Верните запись tblSurvey, если (материал даты и s.Unsubstianted) или (дата и все остальное) – jamone

+3

cross join is, если у вас есть 20 записей в tblSurveys и 30 в tblTypes_for_Surveys, а затем 50 в tblSurvey_Types, это вернет 30 000 строк. – Fredou

Смежные вопросы