C# 在where子句中使用count的ado.net实体框架
我试图执行以下查询,但返回了错误的结果C# 在where子句中使用count的ado.net实体框架,c#,linq,entity-framework,.net-3.5,ado.net,C#,Linq,Entity Framework,.net 3.5,Ado.net,我试图执行以下查询,但返回了错误的结果 foreach (var item in (from project in db.Projects where project.Id == pProjectId from task in project.Tasks from taskItem in task.Ta
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生成对象。表格结构是,每个任务项可能有许多速度。在这个调用之前,我给出了一些项目的速度,但是它们并没有被where子句过滤。我是不是做错了什么
编辑:我认为(在盯着代码看了一会儿之后)我需要指定某种类型的分组。实际上,我不需要任何Velocity记录的详细信息,只需要计算与taskItems相关的详细信息。您需要连接以反映关系,目前您正在进行笛卡尔(交叉)连接(即项目、任务和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
};
您可以尝试将taskItem.velocies.Count()移动到select new{}
然后在结果列表中进行选择,其中级别计数==0您在查询之前是否保存了对实体模型的更改 实体模型正在查询您的数据库以检索这些值,如果您正在向实体添加数据但尚未将其保存到数据库,则查询无法了解这些新值
在查询之前尝试db.SaveChanges()。我认为这不是正确答案。“project.Tasks中的from task”实际上执行一个内部连接,因此我相信如果我按照您的建议执行,那么实际上必须是“join task in db.Tasks”&c,在这种情况下,我将创建一个连接,我可以免费获得该连接。此外它给出了完全相同(错误)的结果:/不过谢谢!您还可以使用以下命令执行左外部联接:。。。将r.prop上的source中的r与other.prop合并成行。但如果不了解更多的数据模型,就很难具体说明。(仅检查具有多个速度的taskItems在您的原始版本中是正确的。)这就是我所做的。。。在这一点上,我的应用程序表现良好,如果有点次优。