[英]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.