【发布时间】: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