2010-07-22 5 views
3

J'ai la méthode LINQ ci-dessous que j'essaie de créer. Le problème semble être la deuxième clause WHERE. Je reçois cette erreur ->Multiple WHERE dans la même méthode SQL LINQ 2

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<MatrixReloaded.Data.CMO.tblWorkerHistory>' to 'bool'

J'ai aussi eu && là vs WHERE mais je recevais une erreur semblable. Je n'ai besoin de rien de tblWorkerHistories sauf les choses EndDate.

Il y a un plusieurs à plusieurs entre les 2 tables avec EnrollmentID étant sur FK les deux.

public static DataTable GetCurrentWorkersByEnrollmentID(int enrollmentID) 
    { 
     using (var context = CmoDataContext.Create()) 
     { 
      context.Log = Console.Out; 

      var currentWorkers = from enrollment in context.tblCMOEnrollments 
           where enrollment.EnrollmentID == enrollmentID 
           where enrollment.tblWorkerHistories.Where(a => a.EndDate == null || a.EndDate > DateTime.Now) 
           select 
            new 
             { 
              enrollment.CMONurseID, 
              enrollment.CMOSocialWorkerID, 
              SupportWorkerName = enrollment.tblSupportWorker.FirstName + " " + enrollment.tblSupportWorker.LastName, 
              SupportWorkerPhone = enrollment.tblSupportWorker.Phone 
             }; 

      return currentWorkers.CopyLinqToDataTable(); 
     } 
    } 

Répondre

4

C'est le problème:

where enrollment.tblWorkerHistories.Where(/* stuff */) 

Where retourne une séquence ... alors que vous avez besoin de quelque chose qui retournera une valeur booléenne. Qu'est-ce que vous essayez de faire avec cette clause Where intégrée?

Comme Marc dit, il pourrait être que vous avez juste besoin d'un appel Any au lieu de Where ... mais si vous pouvez expliquer ce que vous essayez de faire, ce serait rendre beaucoup plus facile de vous aider. Notez que Any renvoie une valeur booléenne au lieu d'une séquence.

EDIT: D'accord, donc en SQL vous utiliseriez une jointure, mais vous n'avez pas besoin d'une jointure explicite ici car LINQ le fait implicitement pour vous, n'est-ce pas? Si vous essayez de trouver des inscriptions où tout des histoires correspondent à la date, et vous ne se soucient pas des histoires elles-mêmes, alors Any est bien ce que vous voulez:

var currentWorkers = from enrollment in context.tblCMOEnrollments 
        where enrollment.EnrollmentID == enrollmentID 
        where enrollment.tblWorkerHistories.Any 
          (a => a.EndDate == null || a.EndDate > DateTime.Now) 
        select ... 
+0

En termes SQL Je suis en train pour ce faire -> 'dE tblWorkerHistory h \t jointure tblCMOEnrollment e \t \t sur h.EnrollmentID = e.EnrollmentID OÙ h.EnrollmentID = anINTHere ET (h.EndDate IS NULL) OR (h.EndDate> GetDate ()) ' –

+0

J'essaie de limiter mon jeu de résultats de' tblCMOEnrollments' basé sur le champ EndDate dans 'tblWorkerHistor ies' –

+0

Merci, ça a fait l'affaire. Side Note, y a-t-il une différence entre utiliser un second WHERE et &&? Ils semblent tous les deux fonctionner .... –

4

Je suppose que vous voulez dire .Any au lieu de .Where dans la sous-requête; la .Where la plus externe (la seconde where) attend un prédicat expression, mais le vôtre est actuellement un sélecteur - Essayez:

where enrollment.tblWorkerHistories.Any(
     a => a.EndDate == null || a.EndDate > DateTime.Now) 
Questions connexes