NHibernate UniqueResult替代?

时间:2012-03-14 12:46:07

标签: nhibernate hql

我们在一个项目中使用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查询中使用列表时更好的方法来处理“当有值时,只有一个”的情况?

1 个答案:

答案 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();