2009-07-06 94 views
0

我试图执行下面的查询,但我得到了错误的结果。ado.net实体框架在where子句中使用count

 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 
           })) 
     { 
     } 

我想从没有速度相关对象的所有taskItems生成对象。表结构是每个taskItem可以有很多速度。在这次调用之前,我给出了一些项目的速度,但是它们没有被这个where子句过滤。我做了什么明显的错误?

编辑:我认为(在盯着代码一段时间后)我需要指定某种分组。我实际上并不需要任何Velocity记录详细信息,而只是与任务项目相关的计数。

回答

2

你可以尝试移动taskItem.Velocities.Count()内选择新的{}

然后做一个选择的结果列表,其中velicties指望= = 0

0

您需要有连接来反映关系,目前您正在进行笛卡尔(交叉)连接(即项目,任务和taskItem的所有组合)。

试着这么做:

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

我不相信这是正确的答案。 '在project.Tasks任务'实际上执行一个内部连接,所以我相信如果我做了你的建议,它实际上必须是'在db.Tasks中连接任务'&c,在这种情况下,我会创建一个连接,我可以免费获得。此外......它给出了完全相同的(错误的)结果:/谢谢! – 2009-07-06 13:10:26

+0

您也可以通过以下方法执行左外连接:...将r.prop中的r连接到source,并将other.prop等同于行。但不知道更多的数据模型很难具体。 (只是检查具有多个速度的taskItems在原始文件中是正确的。) – Richard 2009-07-06 15:19:45

0

您是否在查询之前将更改保存到实体模型?

实体模型正在查询您的数据库以检索这些值,如果您要将数据添加到实体但是没有将它们保存到数据库,查询无法了解这些新值。

在查询之前尝试db.SaveChanges()。