2013-02-21 54 views
0

我正在使用EF Code First。现在,我很难弄清楚如何编写LINQ以将数据检索到我的Controller中的模型中,以便在视图中显示它们。基本上,我收到HolterTest数据源,并且正在尝试为执行一系列特定任务来处理HolterTest的人创建一个工作列表,允许他们在任务完成时标记任务,并提供状态单个测试正在进行中基本的Task类是这样的,它们可以添加或改变流程中的步骤,而displayOrder则是任务完成的顺序。 WorkTask是一项任务的特定实例,允许我们标记谁完成了它,以及何时完成。 WorkItem是包含HolterTest,WorkTasks列表和状态信息(包括WorkTasks全部完成时)的复杂类型。如何编写Linq查询以获取复杂模型项目?

模型类:

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的名单,发现没有一个工作项的那些,并创建工作项,在HolterTests包括WorkTasks关联,基于任务的当前活动列表。

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

回答

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... 
} 
+0

谢谢,马克。起初我并不了解导航项目,因为它与我以前的工作不同(我们使用NHibernate而不是EntityFramework,使用不同的数据库等),这有很大帮助。 – 2013-02-22 14:55:31

1

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

但是从这里开始,可能更适用:EF英孚主要网站http://msdn.microsoft.com/en-us/data/ee712907

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

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

+0

我确实从您建议的示例开始,并且设置了数据库迁移。关系似乎是正确的,但我想我不明白我需要如何设置导航属性。 – 2013-02-21 15:49:31

+0

然后你非常亲密.... – 2013-02-21 15:55:02