代码之家  ›  专栏  ›  技术社区  ›  Niels Bosma

对存储过程的结果进行排序

  •  3
  • Niels Bosma  · 技术社区  · 16 年前

    我希望对存储过程结果中的列进行排序,而不必在存储过程中添加ORDER BY子句。我不希望在执行查询后对数据进行排序,如果可能,排序应该是查询的一部分。我有以下代码:

    public static DataTable RunReport(ReportQuery query)
    {
        OffertaDataContext db = new OffertaDataContext();
        Report report = (from r in db.Reports where r.Id == (int)query.ReportId select r).Single(); 
        //???: check security clearance.
    
        DataSet dataSet = new DataSet();
    
        /*
        doesn't work, I guess the "Result" table hasn't been created yet;
        if(!string.IsNullOrEmpty(query.SortField))
        {
            dataSet.DefaultViewManager.DataViewSettings["Result"].Sort = query.SortField + " " + (query.SortAscending ? "ASC" : "DESC"); 
        }
        */
    
        using (SqlConnection conn = new SqlConnection(Config.ConnectionString))
        {
            conn.Open();
            using (SqlCommand exec = conn.CreateCommand())
            {
                using (SqlDataAdapter adapter = new SqlDataAdapter())
                {
                    exec.Connection = conn;
                    exec.CommandType = CommandType.StoredProcedure;
                    exec.CommandText = report.ReportProc;
    
                    adapter.SelectCommand = exec;
                    try
                    {
    
                        adapter.Fill(dataSet, query.Skip, query.Take, "Result");
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    finally
                    {
                        conn.Close();
                    }
                    return dataSet.Tables["Result"];
                }
            }
        }
    }
    

    如何添加排序?

    2 回复  |  直到 6 年前
        1
  •  2
  •   JohnIdol    16 年前

    获取正在数据集中填充的数据表(“结果”)。

    现在-除了通过查询、查看或存储之外,无法对数据表进行排序。 填充它的过程。

    由于您不想在SP中执行此操作,因此可以对 数据表或与数据表关联的任何数据视图。

    您可以使用DataView的Sort属性来实现它。这是一个字符串,指定要排序的列和顺序(asc或desc)。

    例子:

    myTable.DefaultView.Sort = "myColumn DESC";
    

    现在,您可以使用默认视图来执行任何您想要的操作(将其绑定到某个或任何对象上)

        2
  •  1
  •   Marc Gravell    16 年前

    老实说,因为您使用的是数据表,所以您也可以在客户机上进行排序。

    通过sps等进行动态排序(在服务器上)始终是一个难题;要在纯TSQL中执行,要么在选择的末尾需要一些效率极低的case块,要么使用动态SQL(例如,通过sp_executesql),在最终查询中操纵order by。唯一的其他选项(在raw tsql中)是exec/in to,将数据获取到表变量(或temp表)中,然后使用order by从中进行选择。

    如果它是一个选项,那么linq-to-sql在这一点上实际上是可以的;它支持查询(并根据)UDF组合-因此,不要使用SP,而是在UDF中对查询进行编码(如果需要支持遗留调用程序,则SP总是可以从UDF中选择)。然后您可以在LINQ查询中使用“ORDER BY”等:

    var qry = from row in ctx.SomeMethod(args)
              order by row.Name, row.Key
              select row;
    

    (或者有各种方法可以向LINQ查询添加动态排序-上面只是一个简单的示例)

    最终的TSQL如下:

    SELECT blah FROM theudf(args) ORDER BY blah
    

    也就是说,它会使它正确,并在服务器上执行“排序依据”。这在与一起使用时特别有用 Skip() Take() 获取页面数据。