我们在一个项目中使用NHibernate,该数据从数据库中获取数据并将报告写入单独的系统。在我的情景中,患者通常(但并非总是)在撰写报告时安排下一次预约。下面的查询获取要包含在报告中的下一个约会数据。
private NextFollowup GetNextFollowup(int EncounterID)
{
try
{
NextFollowup myNextF = new NextFollowup();
IQuery myNextQ = this.Session.GetNamedQuery("GetNextFollowup").SetInt32("EncounterID", EncounterID);
myNextF = myNextQ.UniqueResult<NextFollowup>();
return myNextF;
}
catch (Exception e)
{
throw e;
}
}
以下是问题:
通常这样可以正常工作,因为在安排约会时会有一个结果。但是,在没有下一次跟进的情况下,我得到的错误是没有唯一的结果。我真的不想在这种情况下抛出异常,我想返回空对象。如果我得到一个列表而不是UniqueResult,我会在没有下一个后续跟踪的情况下得到一个空列表。有没有比在HQL查询中使用列表时更好的方法来处理“当有值时,只有一个”的情况?
答案 0 :(得分:2)
这可能有效:
private NextFollowup GetNextFollowup(int encounterID)
{
IQuery query = this.Session.GetNamedQuery("GetNextFollowup").SetInt32("EncounterID", encounterID);
// nextFollowup will be either the next instance, or null if none exist in the db.
var nextFollowup = query.Enumerable<NextFollowup>().SingleOrDefault();
return nextFollowup;
}
注意:更新命名以遵循Microsoft最佳做法
try catch在这里没有任何用处,除非在有异常的情况下松散堆栈跟踪,所以我已将其删除。
如果您想要返回新的NextFollowup(如果不存在),您可以将查询行更新为:
var nextFollowup = query.Enumerable<NextFollowup>().SingleOrDefault() ?? new NextFollowup();