如何编写Linq查询以获取复杂的模型项?

时间:2013-02-21 15:12:55

标签: asp.net-mvc-3 linq entity-framework linq-to-entities

我正在使用EF Code First。现在,我很难弄清楚如何编写LINQ以将数据检索到我的Controller中的模型中,以便在视图中显示它们。基本上,我正在接收HolterTest数据的提要,我正在尝试为执行一系列特定任务的人员创​​建一个工作清单来处理HolterTest,允许他们在任务完成时标记任务,并提供其中的状态过程中的各个测试基本的Task类是这样的,它们可以添加或改变过程中的步骤,displayOrder是完成任务的顺序。 WorkTask是任务的特定实例,允许我们标记完成任务的人员以及何时完成任务。 WorkItem是一种复杂类型,包括HolterTest,WorkTasks列表和状态信息,包括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; }

}

目前我有一个业务逻辑功能,它接受HolterTests列表,找到没有WorkItem的那个,并创建WorkItems,根据当前活动的Tasks列表关联HolterTests,包括WorkTasks。 / p>

我的问题是如何编写LINQ以获取WorkItemController的所有WorkItems(及其子项),以便我可以在PatientNumber中显示要在View(WorkItems,其中IsCompleted = false)中执行的工作,并使其成为可能可以更新特定WorkItem的WorkTasks。

2 个答案:

答案 0 :(得分:1)

Linq向实体解释 http://msdn.microsoft.com/en-us/library/bb399367.aspx

但从这里开始可能更适合:EF主站点http://msdn.microsoft.com/en-us/data/ee712907

如果你真的想直接潜入这个视频和示例代码。 http://msdn.microsoft.com/en-us/data/jj193542 然后看这个http://msdn.microsoft.com/en-us/data/jj573936

基本上基于POCO,您可以阅读每个POCO并以此方式获取数据。 但是,如果POCOS具有定义的导航属性和外键,则EF会进行大量繁重的工作。值得重新审视POCO定义和Code-First模式。

答案 1 :(得分:1)

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

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; }

}

按患者编号访问工作项的简单功能是:

IEnumerable<WorkItem> GetWorkIncompleteWorkItemsByPatient(string patientNumber)
{
  var db = new YourContext();
  return db.WorkItems.Where(wi => wi.IsCompleted == false && wi.HolterTest.PatientNumber == patientNumber);
}

然后,要处理相关任务,您可以通过任务访问它,在此示例中,如果您知道任务ID:

var workTask = YourWorkItem.WorkTasks.FirstOrDefault(wt => wt.WorkTaskID == worktaskId);

您可以查看工作项中的所有任务,如下所示:

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