首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不从DB加载行的情况下从IQueryOver获取计数

在不从DB加载行的情况下从IQueryOver获取计数
EN

Stack Overflow用户
提问于 2017-07-30 10:30:35
回答 2查看 151关注 0票数 0

有了IQueryOver,我如何才能从它获得行计数,而无需从DB加载所有行?QueryOver有RowCount()方法,但是如果底层查询有组或不同,则会丢弃它们。

*更新*

用于QueryOver.RowCount的see (正如您所看到的,它抛弃了不同的):

代码语言:javascript
复制
exec sp_executesql N'
SELECT count(*) as y0_ 
FROM dbo.OPR_STL_DCM this_ 
left outer join dbo.OPR_STL_LN_ITM lineitem1_ 
on 
this_.DCM_ID=lineitem1_.DCM_ID 
left outer join dbo.OPR_STL_DY_LN_ITM daylineite2_ 
on 
lineitem1_.DCM_ID=daylineite2_.DCM_ID and 
lineitem1_.TND_ID=daylineite2_.TND_ID 
WHERE 
daylineite2_.BSNS_DT >= @p0 and 
daylineite2_.BSNS_DT <= @p1'
,N'@p0 datetime,@p1 datetime',@p0='2016-07-22 00:00:00',@p1='2016-08-21 23:59:59'

为QueryOver生成的SQL:

代码语言:javascript
复制
exec sp_executesql N'
SELECT distinct this_.DCM_ID as y0_, 
    this_.RTL_STR_ID as y1_, 
    this_.WS_ID as y2_, 
    this_.BSNS_DT as y3_, 
    this_.OPR_ID as y4_, 
    this_.TND_RPSTY_ID as y5_, 
    this_.IS_CNC as y6_, 
    this_.IS_SNG_DY_STL as y7_, 
    this_.BGN_DT_TM as y8_, 
    this_.END_DT_TM as y9_ 
FROM dbo.OPR_STL_DCM this_ 
left outer join dbo.OPR_STL_LN_ITM lineitem1_ 
on 
this_.DCM_ID=lineitem1_.DCM_ID 
left outer join dbo.OPR_STL_DY_LN_ITM daylineite2_ 
on 
lineitem1_.DCM_ID=daylineite2_.DCM_ID and 
lineitem1_.TND_ID=daylineite2_.TND_ID 
WHERE daylineite2_.BSNS_DT >= @p1 and 
daylineite2_.BSNS_DT <= @p2'
,N'@p1 datetime,@p2 datetime',@p0=20,@p1='2016-07-22 00:00:00',@p2='2016-08-21 23:59:59'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-26 12:34:43

最后我找到了解决办法。向nhibernate.dialect值中注入MyMsSql2008Dialect。这个类将行计数插入到名为#TempCount的临时表中;现在您可以随后从#TempCount中读取行计数。请注意,这必须在会话中完成。

代码语言:javascript
复制
public class MyMsSql2008Dialect : MsSql2008Dialect
{
    public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit)
    {
        SqlString limitString = base.GetLimitString(queryString, offset, limit);

        SqlStringBuilder ssb = new SqlStringBuilder();

        string resultCountQuery = string.Format(
            @"
                INSERT INTO #TempCount
                SElECT COUNT(*) AS Count FROM 
                (
                    {0}
                ) AS _queryResult 
            "
            , queryString);

        ssb.Add(resultCountQuery);

        SqlStringBuilder newLimitString  = new SqlStringBuilder();
        newLimitString.Add(limitString).Add(Environment.NewLine).Add(ssb.ToSqlString());

        return newLimitString.ToSqlString();
    }
}

要计算行数:

代码语言:javascript
复制
int rowsCount = session.CreateSQLQuery("SELECT TOP 1 * FROM #TempCount").UniqueResult<int>();
票数 0
EN

Stack Overflow用户

发布于 2017-08-03 11:53:34

我认为IQueryOver不支持这一点,但不要引用我的话。

我让它和ICriteria一起工作..。

代码语言:javascript
复制
 crit.SetProjection(Projections.Count(Projections.Distinct(Projections.Id())));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45398852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档