Asp.net mvc 3 如何编写Linq查询以获取复杂的模型项?

Asp.net mvc 3 如何编写Linq查询以获取复杂的模型项?,asp.net-mvc-3,linq,entity-framework,linq-to-entities,Asp.net Mvc 3,Linq,Entity Framework,Linq To Entities,我先用EF代码。现在,我很难弄清楚如何编写LINQ,将数据检索到控制器中的模型中,并在视图中显示它们。基本上,我正在接收HolterTest数据的提要,我正在尝试为执行一系列特定任务以处理HolterTest的人员创建一个工作列表,允许他们在完成任务时标记任务,并提供单个测试在流程中的位置状态,基本任务类是这样的,以便它们可以在流程中添加或更改步骤,displayOrder是任务完成的顺序。WorkTask是任务的一个特定实例,允许我们标记谁完成了它,以及何时完成。WorkItem是一种复杂类型

我先用EF代码。现在,我很难弄清楚如何编写LINQ,将数据检索到控制器中的模型中,并在视图中显示它们。基本上,我正在接收HolterTest数据的提要,我正在尝试为执行一系列特定任务以处理HolterTest的人员创建一个工作列表,允许他们在完成任务时标记任务,并提供单个测试在流程中的位置状态,基本任务类是这样的,以便它们可以在流程中添加或更改步骤,displayOrder是任务完成的顺序。WorkTask是任务的一个特定实例,允许我们标记谁完成了它,以及何时完成。WorkItem是一种复杂类型,包括HolterTest、WorkTasks列表和状态信息,包括工作任务全部完成的时间

模型类:

public class HolterTest
{
    public Int32 HolterTestID { get; set; }
    public string PatientNumber { get; set; }
    public string LastName { get; set; }
    public DateTime RecordingStartDateTime { get; set; }
    public System.Nullable<DateTime> AppointmentDateTime { get; set; }

}

public class Task
{
    public Int32 TaskID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Int32 DisplayOrder { get; set; }
    public bool IsActive { get; set; }
}

public class WorkTask
{
    public Int32 WorkTaskID { get; set; }
    public Task Task { get; set; }
    public bool IsCompleted { get; set; }
    public System.Nullable<DateTime> CompletedDateTime { get; set; }
    public string CompletedBy { get; set; }
}   

public class WorkItem
{
    public Int32 WorkItemID { get; set; }
    public HolterTest HolterTest { get; set; }
    public string Status { get; set; }
    public List<WorkTask> WorkTasks { get; set; }
    public bool IsStarted { get; set; }
    public bool IsCompleted { get; set; }
    public System.Nullable<DateTime> CompletedDateTime { get; set; }

}
公共级HolterTest
{
公共Int32 HolterTestID{get;set;}
公共字符串PatientNumber{get;set;}
公共字符串LastName{get;set;}
公共日期时间记录开始日期时间{get;set;}
public System.Nullable AppointmentDateTime{get;set;}
}
公开课任务
{
公共Int32任务ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共Int32显示顺序{get;set;}
公共bool IsActive{get;set;}
}
公共类工作任务
{
公共Int32工作任务ID{get;set;}
公共任务任务{get;set;}
公共布尔已完成{get;set;}
public System.Nullable CompletedDateTime{get;set;}
由{get;set;}完成的公共字符串
}   
公共类工作项目
{
公共Int32工作项ID{get;set;}
公共HolterTest HolterTest{get;set;}
公共字符串状态{get;set;}
公共列表工作任务{get;set;}
公共布尔值已开始{get;set;}
公共布尔已完成{get;set;}
public System.Nullable CompletedDateTime{get;set;}
}
目前,我有一个业务逻辑函数,它获取HolterTests列表,查找没有WorkItem的HolterTests,并创建WorkItems,根据当前活动的任务列表关联HolterTests,包括WorkTasks

我的问题是如何编写LINQ来获取我的WorkItemController的所有WorkItem(及其子项),这样我就可以通过PatientNumber在视图(WorkItems where IsCompleted=false)中显示要做的工作,并可以更新特定WorkItem的WorkTasks。

LINQ to entities

但从这里开始可能更合适:EF主站点

如果你真的想直接进入这个视频和示例代码。 那么看看这个

基本上基于您拥有的POCO,您可以读取每个POCO并以这种方式获取数据。
但是,如果POCO具有导航属性和定义的外键,EF将承担很多繁重的工作。值得重温POCO定义和代码优先模式

您想使用相关的导航属性访问它。请注意,在您的示例中,尚未将导航属性设置为虚拟。您应该像这样更新您的模型:

public class WorkItem
{
    public Int32 WorkItemID { get; set; }
    public virtual HolterTest HolterTest { get; set; }
    public string Status { get; set; }
    public virtual List<WorkTask> WorkTasks { get; set; }
    public bool IsStarted { get; set; }
    public bool IsCompleted { get; set; }
    public System.Nullable<DateTime> CompletedDateTime { get; set; }

}
foreach (var workTask in YourWorkItem.WorkTasks)
{
  //your logic here...
}
您可以查看工作项中的所有任务,如下所示:

public class WorkItem
{
    public Int32 WorkItemID { get; set; }
    public virtual HolterTest HolterTest { get; set; }
    public string Status { get; set; }
    public virtual List<WorkTask> WorkTasks { get; set; }
    public bool IsStarted { get; set; }
    public bool IsCompleted { get; set; }
    public System.Nullable<DateTime> CompletedDateTime { get; set; }

}
foreach (var workTask in YourWorkItem.WorkTasks)
{
  //your logic here...
}

我确实从您建议的示例开始,并且已经设置了数据库迁移。这些关系似乎是正确的,但我想我不明白如何设置导航属性。谢谢,马克。起初我不理解导航项,因为它与我以前的工作不同(我们使用NHibernate而不是EntityFramework,使用不同的DB等。这非常有帮助。