代码之家  ›  专栏  ›  技术社区  ›  Pieter Breed

在WHERE子句中使用COUNT的ADO.NET实体框架

  •  0
  • Pieter Breed  · 技术社区  · 15 年前

    我试图执行以下查询,但返回了错误的结果。

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

    我尝试从所有没有速度相关对象的任务项生成对象。表结构是每个任务项都有许多速度。在这个调用之前,我给出了一些项的速度,但是它们没有被这个where子句过滤。我做了什么明显的错误吗?

    编辑:我认为(在看了一会儿代码之后)我需要指定某种分组。实际上,我不需要任何速度记录细节,只需要一些与任务项相关的细节

    3 回复  |  直到 15 年前
        1
  •  2
  •   Shiraz Bhaiji    15 年前

    您可以尝试将taskItem.speeds.count()移动到select new中。

    然后在结果列表上进行选择,其中速度计数=0

        2
  •  0
  •   Richard    15 年前

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

    尝试以下方法:

    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
              };
    
        3
  •  0
  •   Gusman    15 年前

    在查询之前是否保存了对实体模型的更改?

    实体模型正在查询数据库以检索这些值,如果您正在向实体添加数据,但尚未将其保存到数据库,则查询无法了解这些新值。

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