【发布时间】:2015-08-31 16:10:06
【问题描述】:
我读到的是,实现“存在”的方法是获取第一个匹配条件的寄存器(在 SQL Server 中它将是 SELECT TOP(1)...),但它必须与Oracle 也是,我不太确定在 Oracle 中,使用 rownumber 是否如此有效。此外,它必须是可扩展的,我可以拥有从 2 或 3 个寄存器到 2 或 3 百万...
我目前的解决方案是这样的:
int? result = this.Session
.QueryOver<Address>()
.Where(a => a.Customer.Id == customerId && a.IsMain == true)
.Select(a => a.Id)
.Take(1)
.SingleOrDefault<int?>();
return result != null;
这会在 SQL Server 上生成一个 select top (1) 查询,我认为它比计数(特别是大量)更有效,但在 Oracle 中,生成的查询是这样的:
SELECT y0_
FROM (
SELECT this_.ADD_Id AS y0_
FROM ADDRESSES this_
WHERE (
this_.CUS_Id = 3942425
AND this_.ADD_ISMAIN = 'AAAAAAAAAA'
)
)
WHERE rownum <= 1
我不太确定该查询在 Oracle 上的效率。
有人可以帮助我使用相同的 NHibernate 指令在两种环境中获得最有效的查询吗?我在一些帖子中找到了类似 Any() 方法,但在 QueryOver 上找不到它...
【问题讨论】:
标签: sql oracle nhibernate queryover