繁体   English   中英

SQL Server Search,如何返回总行数?

[英]SQL Server Search, how to return the total count of rows?

我有另一个帖子导致了这个

SELECT DISTINCT
        a.ArticleID, 
        COUNT(*) AS KeywordMatch,
        a.Headline,
        a.ShortDescription,
        a.CategoryID,
        a.ArticleSectionImage,
        a.DatePublished
    FROM 
        Article a
    JOIN SearchWords sw ON a.ArticleID = sw.ArticleID
    WHERE
        EXISTS 
        (
            SELECT 
              1 
            FROM 
              iter_charlist_to_tbl(@temp, ' ') s 
            WHERE
              s.nstr = sw.SearchWord
        )
        AND
            a.ArticleState = 3  
    GROUP BY 
        a.ArticleID, a.Headline, a.ShortDescription, a.CategoryID, a.ArticleSectionImage, a.DatePublished
    ORDER BY (KeywordMatch) DESC, (a.DatePublished) DESC

我与Linq-to-SQL一起使用它来为用户创建分页。 问题是,我需要知道我的搜索返回了多少条记录(总行数),以便为用户显示正确的箭头。

这是我的Linq-to-SQL查询:

  int iPageNum = pageNumber;
  int iPageSize = (int)pageSize;

  results = data.SearchArticles(searchString).Skip((iPageNum - 1) * iPageSize).Take(iPageSize).ToList(); 

有任何想法吗?

我的Linq-to-SQL是否从数据库中提取所有记录? 或者它是否创建只选择我需要的记录的查询? 我怎样才能在查询中达到顶峰?

一种方法是有两个查询:一个返回计数,另一个返回数据。

您可以将它们放在一个具有多个结果集的SP中,以避免额外的数据库往返。 我在我的书中详细解释了一个数据分页示例(包括提供计数): Ultra-Fast ASP.NET 我的方法不使用LINQ(因为它不支持多个结果集),但它也更快。

这是一个应该计算结果中行数的查询(未测试,但应该关闭):

;WITH SearchArticles (aid, cnt, headline, descr, cid, img, datepub) as (  
SELECT DISTINCT
            a.ArticleID, 
            COUNT(*) AS KeywordMatch,
            a.Headline,
            a.ShortDescription,
            a.CategoryID,
            a.ArticleSectionImage,
            a.DatePublished
        FROM 
            Article a
        JOIN SearchWords sw ON a.ArticleID = sw.ArticleID
        WHERE
            EXISTS 
            (
                    SELECT 
                      1 
                    FROM 
                      iter_charlist_to_tbl(@temp, ' ') s 
                    WHERE
                      s.nstr = sw.SearchWord
            )
            AND
                    a.ArticleState = 3      
        GROUP BY 
            a.ArticleID, a.Headline, a.ShortDescription, a.CategoryID,
            a.ArticleSectionImage, a.DatePublished
) SELECT COUNT(*) FROM SearchArticles

既然你正在使用data.SearchArticles部分获取整个集合,为什么不这样做:

var results = data.SearchArticles(searchString);
var count = results.Count();

results = results.Skip((iPageNum - 1) * iPageSize).Take(iPageSize).ToList();

很大程度上取决于返回结果的大小是否正常。

阅读完对其他答案的评论后:

SQL Server没有内置分页。 因此,默认情况下,查询将获取所有行。 如果查询未获取所有行,则ResultSet对象正在为您执行分页。 如果结果集不是分页,则无需遍历所有结果以检查其Count()属性,只需正确设置它,因为SQL Server确实将行计数与数据一起返回。

如果您担心一次性获取太多数据而结果集没有页面,那么您需要先选择计数,然后构建一个可以返回所需数据页面的查询。

旁白:你可以将你的选择留下。 由于您正在聚合和分组,因此您可以保证获得明显的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM