Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server搜索,如何返回总行数?_C#_Sql Server_Linq To Sql_Select_Count - Fatal编程技术网

C# SQL Server搜索,如何返回总行数?

C# SQL Server搜索,如何返回总行数?,c#,sql-server,linq-to-sql,select,count,C#,Sql Server,Linq To Sql,Select,Count,我还有另一个原因 SELECT DISTINCT a.ArticleID, COUNT(*) AS KeywordMatch, a.Headline, a.ShortDescription, a.CategoryID, a.ArticleSectionImage, a.DatePublished FROM Article a JOIN SearchW

我还有另一个原因

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
我将它与LINQtoSQL一起用于为用户创建分页。问题是,我需要知道搜索返回的总行数是多少,以便为用户显示正确的箭头

这是我的Linq到SQL查询:

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

  results = data.SearchArticles(searchString).Skip((iPageNum - 1) * iPageSize).Take(iPageSize).ToList(); 
有什么想法吗

我的Linq到SQL是否正在从数据库中提取所有记录?还是创建一个只选择我需要的记录的查询?
我如何才能在查询时达到峰值?

既然您正在使用数据获取整个集合。SearchArticles部分为什么不这样做:

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

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

这在很大程度上取决于返回结果的大小,取决于返回结果是否正确。

既然您正在使用数据获取整个集合。SearchArticles部分为什么不这样做:

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

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

这在很大程度上取决于返回结果的大小。一种方法是有两个查询:一个返回计数,另一个返回数据

您可以将它们放在具有多个结果集的一个SP中,以避免额外的DB往返。我解释了一个数据分页示例,包括在我的书中提供了一个详细的计数:。我的方法不使用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

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

您可以将它们放在具有多个结果集的一个SP中,以避免额外的DB往返。我解释了一个数据分页示例,包括在我的书中提供了一个详细的计数:。我的方法不使用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

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

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

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


旁白:您可以在选择时不使用distinct。由于您正在聚合和分组,因此保证您已经有了不同的结果。

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

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

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


旁白:您可以在选择时不使用distinct。由于您正在聚合和分组,因此可以保证已经有了不同的结果。

您正在编写什么类型的客户机?有一个合理的可能性,那就是已经有了一个页面组件,你可以直接使用它。我正在为我们的新报纸网站,小网站添加搜索功能。所以我自己做每件事。你在写什么类型的客户?有一个合理的可能性,那就是已经有了一个页面组件,你可以直接使用它。我正在为我们的新报纸网站,小网站添加搜索功能。所以我自己做每件事。总的想法是避免获取整个结果集。。。为什么它要返回整个记录集?我试图找到一种方法来查看通过该语句生成的SQL查询。如果要提取所有内容,它将返回许多行。如果要这样做,那么我将多次枚举结果并得到一条错误消息。如果希望避免提取整个集合,那么我建议使用一个存储过程,它将同时返回分页集合和总计数。请参阅本文:总体思路是避免获取整个结果集。。。为什么它要返回整个记录集?我试图找到一种方法来查看通过该语句生成的SQL查询。如果要拉取所有内容,它将返回很多行。如果要这样做,那么我将多次枚举结果并获得错误消息。如果您希望避免拉取整个集合,那么我建议使用一个存储过程,该过程将返回两个pag
ed集合和总计数。请参阅本文:在Linq中,您不能将一个变量设置为OUTPUT并将计数分配给该变量吗?我的问题是试图重新构造该查询以返回行数。类似的方法只有在同时返回所有要计数的行时才有效。听起来您需要的是行总数的计数,但只返回其中的一个子集以供显示。正当要获得总计数,您应该能够将查询更改为仅返回count*,并删除group by和order by子句;很对,;很抱歉我会用更好的查询更新我的答案。谢谢;我很想听听你对这本书的看法。你不能在Linq中设置一个变量作为输出,然后将计数分配给那个变量吗?我的问题是试图重新构造该查询以返回行数。类似的方法只有在同时返回所有要计数的行时才有效。听起来您需要的是行总数的计数,但只返回其中的一个子集以供显示。正当要获得总计数,您应该能够将查询更改为仅返回count*,并删除group by和order by子句;很对,;很抱歉我会用更好的查询更新我的答案。谢谢;我很想听听你喜欢这本书吗。