【问题标题】:How to instruct NHibernate to use 'TOP 1' instead of 'FETCH FIRST 1 ROWS ONLY' syntax?如何指示 NHibernate 使用 'TOP 1' 而不是 'FETCH FIRST 1 ROWS ONLY' 语法?
【发布时间】:2021-12-29 05:03:34
【问题描述】:

我正在使用 NHibernate 5.3.3.0 并将 SQL Server Dialect 设置为 MsSql2012Dialect
我可以使用以下代码 SELECT 单行:

session.QueryOver<ProductsEntity>()
        .Where(x => x.ProductName == "xyz")
        .Take(1)
        .SingleOrDefault();

这会生成如下 SQL:

SELECT
    this_.Id as id1_2_0_,
    this_.Name as name2_2_0_,
    this_.Active as active3_2_0_ 
FROM
    [TestDB].[dbo].Products this_ 
WHERE
    this_.Name = @p0 
ORDER BY
    CURRENT_TIMESTAMP OFFSET 0 ROWS FETCH FIRST @p1 ROWS ONLY;

我不希望 ORDER BY 子句成为生成的 SQL 查询的一部分。
我想要如下 SQL 查询:

SELECT TOP 1
    this_.Id as id1_2_0_,
    this_.Name as name2_2_0_,
    this_.Active as active3_2_0_ 
FROM
    [TestDB].[dbo].Products this_ 
WHERE
    this_.Name = @p0;

如何配置QueryOver 或NHibernate 以使用TOP 1 而不是ORDER BY ..... FIRST @p1 ROWS ONLY 语法?我不想更改Dialect。我也不想使用 HQL 或 SQL。

我在 Stack Overflow 和其他论坛上阅读了许多其他相关问题;他们都没有讨论ORDER BY ..... FIRST @p1 ROWS ONLY 子句。


我也尝试过使用session.Query,如下所示:

session.Query<ProductsEntity>()
        .Where(x => x.ProductName == "xyz")
        //.Take(1)
        .FirstOrDefault();

结果是一样的;不用找了。无论.Take(1)被评论与否,结果都是一样的。

这里要注意的是,FirstOrDefault 是从using System.Linq; 使用的;不是来自using NHibernate.Linq;。即使我添加了Remotion.Linq.dll 的引用,结果也是一样的。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    您是否尝试过.FirstOrDefault() 而不是组合.Take(1).SingleOrDefault()

    【讨论】:

    • NHibernate 5.3.3.0 中没有FirstOrDefault() 方法。
    • 甚至不在带有session.Query&lt;TEntity&gt;()...FirstOrDefault() 的 NHibernate.Linq 命名空间中?不过,您可能需要参考 Remotion.Linq 包。
    • 感谢您的回复。我尝试了它并用结果更新了问题。我错过了什么吗?您能在此处添加代码吗?
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2013-04-29
    相关资源
    最近更新 更多