NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?相关的知识,希望对你有一定的参考价值。

我正在使用FluentNHibernate和NH 3.0,使用LINQ提供程序和新的QueryOver语法。

现在使用QueryOver我想得到一个项目(称为结果),其时间戳值尽可能接近给定值,但不是更大:

 Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.                
        FirstOrDefault(); //get the preceding or matching result, if there is any

现在,Intellisense告诉我,没有像FirstOrDefault()方法这样的东西。当然,我可以枚举我的有序查询,然后使用LINQ获取我的项目。但这会首先将所有项目加载到内存中。

有没有替代FirstOrDefault(),或者我理解完全错误的东西?

答案

NH 3具有集成的LINQ提供程序(查询在内部转换为HQL / SQL)。您必须添加NHibernate.Linq命名空间,然后:

Result precedingOrMatchingResult = Session.Query<Result>().
    Where(r => r.TimeStamp < timeStamp).
    OrderByDescending(r => r.TimeStamp).
    FirstOrDefault();
另一答案

我现在发现我可以在IQueryOver实例上使用Take()扩展方法,并且只对列表进行枚举,如下所示:

Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.   
        Take(1).List(). //enumerate only on element of the sequence!
        FirstOrDefault(); //get the preceding or matching result, if there is any
另一答案
Result precedingOrMatchingResult = Session.QueryOver<Result>()
                                          .Where(r => r.TimeStamp < timeStamp)
                                          .OrderBy(r => r.TimeStamp).Desc
                                          .SingleOrDefault();
另一答案

尝试

Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.
        SetFetchSize(1).
        UniqueResult();

UniqueResult将返回单个值,如果未找到任何值,则返回null,这与First或Default有关。

可能需要也可能不需要将Fetch Size设置为1,我将使用分析器对其进行测试。

另一答案

SetFetchSize(1)是必需的。如果您的LINQ查询返回多个结果,它将使用UniqueResult()抛出NHibernate异常,因为它只期望从查询返回一个结果。

以上是关于NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?的主要内容,如果未能解决你的问题,请参考以下文章

在 NHibernate 3.0 Linq 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为

ORM篇——有关NHibernate查询封装

是否可以直接在 NHibernate 中设置引用的外键?

使用 SQLite“没有这样的表”测试 NHibernate - 生成模式

没有 LINQ 扩展的 NHibernate 通用存储库?

NHibernate 似乎没有批量插入 PostgreSQL