2010-02-02 6 views
0

J'ai la requête LINQ suivante. Le problème est qu'il retourne 13k résultats quand tblSurveys a seulement 20 total. Qu'est-ce que je fais mal?La requête LINQ renvoie bien plus de résultats que dans l'ensemble de la base de données

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; 

Répondre

1

Avez-vous configuré des clés et des relations étrangères dans votre base de données? Si c'est le cas, vous pouvez grandement simplifier votre requête. Je recommande également de renommer vos tables dans le fichier .dbml afin qu'elles ne soient pas toutes préfixées avec 'tbl'.

Si vous avez la configuration des relations, votre requête pourrait ressembler (quelque chose) comme ceci:

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

Wow et je pensais que LINQ-SQL était puissant avant. C'est bien. Cela m'a facilité beaucoup de choses sachant que les clés/relations étrangères traitent cela pour vous. – jamone

5

Je peux voir une jointure croisée là-bas, regardez la < -------

  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; 

il semble que vous devez faire une gauche rejoindre ici

+2

pourquoi un downvote? – Fredou

+0

Je ne vois pas ce qui est mauvais dans une jointure croisée. (Il suffit de le chercher) (Je n'ai pas voté en bas) Soit retourner un enregistrement tblSurvey si (la date et le matériel) ou (la date et tout le reste) – jamone

+3

cross join est, si vous avez 20 record dans tblSurveys et 30 dans tblTypes_for_Surveys puis 50 dans tblSurvey_Types, cela retournera 30 000 lignes – Fredou

Questions connexes