2013-10-22 34 views
0

我有两种EF类型,Study和Patient。一项研究可以有很多患者。我想从一个特定的研究返回的患者名单,所以我有这样的方法:选择子列表?

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    return Context.Studies.Where(e => e.StudyId == id).Select(s => s.Patients).First(); 
} 

这工作,但它肯定看起来怪异,并在最后,首先()调用。我觉得我做得不对。有没有更清晰或更正确的方法来做到这一点?

回答

0

你可以写这样的:

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    return Context.Studies.Single(e => e.StudyId == id).Patients; 
} 

这将获得所需的研究,然后选择与该研究所有患者。当然,你需要确保id参数是有效的。发生此下面的代码将防止一些不必要的例外:

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    Study selectedStudy = Context.Studies.SingleOrDefault(e => e.StudyId == id); 
    return selectedStudy == null ? null : selectedStudy.Patients; 
} 

(或Enumerable.Empty<Patient>(),而不是null如果你喜欢)

+0

其实我有查询不会返回所有患者的名单(有4个在我的情况),所以它的行为和预期的一样 - 但是它是让我为我感到困惑的First()。你的语法也不适合我。没有'Select()'关闭'Single()'。也许这是因为我使用EF6? – Nicros

+0

我刚刚编辑了我的帖子,确实是一个错误。它现在应该工作。在您最初的查询中,Context.Studies.Where(e => e.StudyId == id).Select(s => s.Patients)会为您提供一组患者集合,因为Select不会压扁集合(与SelectMany不同) 。以此查询的First()元素为您提供患者集合,这就是您仍然可以获得所需结果的原因。 –

+0

这工作,感谢编辑。我必须添加的唯一东西是患者包括 - 所以'上下文。研究。包括(“患者”)。单等。这是因为我的EF延迟加载设置。谢谢! – Nicros