【问题标题】:Distinct Pagination with ROW_NUMBER() and Total Count in ASP.NetASP.Net 中使用 ROW_NUMBER() 和总计数的不同分页
【发布时间】:2012-10-10 02:10:06
【问题描述】:

在 Asp.net 中,我尝试使用以下代码实现分页:

String query="SELECT * "+
             "FROM (SELECT Distinct emp_name, emp_address, "+
             "         ROW_NUMBER() OVER(ORDER BY emp_id) AS rownum"+
             "       FROM Employee"+
             "     )as Person "+
             "WHERE rownum>"+ start +" and rownum <="+ end +";

SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();

SqlDataReader reader = cmd.ExecuteReader();

以上代码无法检索Distinct 行。
如何调整我的query 以获得distinct emp_nameorder by emp_id 以及单个ExecuteReader() 中的条目总数?

目前我打电话给ExecuteReader() 两次,第一次是数据,第二次是总数。

我关注了SQL Server DISTINCT pagination with ROW_NUMBER() not distinct,但无法理解如何在我的代码中实现它。请帮忙。

【问题讨论】:

    标签: c# sql-server ado.net pagination


    【解决方案1】:

    Row_Number() 会杀死你的 Distinct。将 Distinct 放在您的子查询中,并将行号放在(外部)结果集上(在您拥有不同的集之后)。

    String query="SELECT *, ROW_NUMBER()  OVER(ORDER BY emp_id) AS rownum "+
              "FROM (SELECT Distinct emp_name, emp_address, emp_id "+
              "       FROM Employee"+
              "     )as Person "+
              "WHERE rownum>"+ start +" and rownum <="+ end +"; 
    

    【讨论】:

    • 您不能在同一查询级别中引用 ROW_NUMBER() 列(它需要在子查询或 CTE 中)
    【解决方案2】:

    使用 String.Format 和原始字符串 (@) 避免串联。

    String query = String.Format(@"
        select emp_name, emp_address, rownum 
        from (
            select
                emp_name, emp_address,
                row_number() over(order by emp_id) as rownum
            from (
                select distinct emp_name, emp_address
                from employee
            ) s
        ) as Person 
        where rownum > {0} and rownum <= {1}
        ;
        select count(*) as total
        from (
            select distinct emp_name, emp_address
            from employee
            where rownum > {0} and rownum <= {1}
        ) s
        ;    
    ", start, end);
    
    SqlCommand cmd = new SqlCommand(query, conn);
    conn.Open();
    
    SqlDataReader reader = cmd.ExecuteReader();
    
    // gets the first data set
    while (reader.Read())
    {
        ...
    }
    
    // gets the second
    reader.NextResult();
    reader.Read();
    int total = (int)reader["total"];
    

    使用NextResult 读取多个结果集。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2018-02-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多