2009-07-06 8 views
0

Ich versuche, die folgende Abfrage auszuführen, aber ich bekomme die falschen Ergebnisse zurück.ado.net Entity Framework mit count in einer Where-Klausel

 foreach (var item in (from project in db.Projects 
           where project.Id == pProjectId 
           from task in project.Tasks 
           from taskItem in task.TaskItems 
           where taskItem.Velocities.Count() == 0 // not finished yet 
           select new 
           { 
            ProjectId = pProjectId, 
            PriorityId = task.Priorities.Id, 
            TaskId = task.Id, 
            ResourceId = taskItem.Resources.Id, 
            EstimatedDuration = taskItem.EstimatedDuration, 
            TaskItemId = taskItem.Id 
           })) 
     { 
     } 
 foreach (var item in (from project in db.Projects 
           where project.Id == pProjectId 
           from task in project.Tasks 
           from taskItem in task.TaskItems 
           where taskItem.Velocities.Count() == 0 // not finished yet 
           select new 
           { 
            ProjectId = pProjectId, 
            PriorityId = task.Priorities.Id, 
            TaskId = task.Id, 
            ResourceId = taskItem.Resources.Id, 
            EstimatedDuration = taskItem.EstimatedDuration, 
            TaskItemId = taskItem.Id 
           })) 
     { 
     } 

Ich versuche, Objekte aus allen TaskItems zu generieren, die keine geschwindigkeitsbezogenen Objekte haben. Die Tabellenstruktur besteht darin, dass jedes taskItem viele Geschwindigkeiten haben kann. Kurz vor diesem Aufruf gebe ich einigen Elementen Geschwindigkeiten, die jedoch nicht durch diese where-Klausel gefiltert werden. Mache ich etwas offensichtlich falsch?

Bearbeiten: Ich denke (nachdem ich den Code für eine Weile starrte), dass ich eine Art von Gruppierung angeben muss. Ich benötige eigentlich keine der Velocity-Datensatzdetails, sondern nur eine Anzahl von ihnen, die sich auf die taskItems beziehen.

Antwort

2

Sie könnten versuchen, die taskItem.Velocities.Count() innerhalb des ausgewählten neuen beweglichen {}

Dann eine Auswahl auf der resultierenden Liste tun, wo die velicties count = = 0

+0

das ist was ich getan habe ... an diesem Punkt ist meine Anwendung gut erzogen, wenn auch ein wenig suboptimal. –

0

Sie müssen Joins haben, um die Beziehungen widerzuspiegeln, derzeit führen Sie eine kartesische (Kreuz-) Verknüpfung durch (dh alle Kombinationen von Projekt, Task und TaskItem).

Versuchen Sie so etwas wie:

var res = from project in db.Projects 
      where project.Id == pProjectId 
      join task in project.Tasks on task.projectId equals project.projectId 
      join ttaskItem in task.TaskItems on taskItem.taskId equals task.taskId 
      where taskItem.Velocities.Count() == 0 // not finished yet 
      select new { 
      ProjectId = pProjectId, 
      PriorityId = task.Priorities.Id, 
      TaskId = task.Id, 
      ResourceId = taskItem.Resources.Id, 
      EstimatedDuration = taskItem.EstimatedDuration, 
      TaskItemId = taskItem.Id 
      }; 
+1

Ich glaube nicht, dass dies die richtige Antwort ist. Die 'from task in project.Tasks' führt tatsächlich einen inneren Join durch, also glaube ich, wenn ich das tat, was Sie vorschlagen, müsste es tatsächlich 'task in db.Tasks' & c sein. In diesem Fall würde ich einen Join erstellen, den ich kann kostenlos bekommen. Außerdem ... Es gibt genau die gleichen (falschen) Ergebnisse:/Danke aber! –

+0

Sie können auch einen linken Outer-Join machen mit: ... verbinden Sie r in der Quelle auf r.prop ist gleich other.prop in Zeilen. Aber ohne mehr von Ihrem Datenmodell zu wissen, ist es schwierig, spezifisch zu sein. (Nur nach Aufgaben zu suchen, die mehr als eine Geschwindigkeit haben, ist in Ihrem Original korrekt.) – Richard

0

Haben Sie die Änderungen am Entitätsmodell vor der Abfrage gespeichert?

Das Entity-Modell fragt Ihre Datenbank ab, um diese Werte abzurufen. Wenn Sie den Entitäten Daten hinzufügen, diese jedoch nicht in der DB gespeichert haben, kann die Abfrage diese neuen Werte nicht erkennen.

Versuchen Sie db.SaveChanges() vor der Abfrage.

Verwandte Themen