在C#中自定义选择DataTable列

时间:2014-09-16 10:45:50

标签: c# sorting datatable

我想选择以C#中给定字母开头的DataTable列。我必须使用Sort Property来完成。我只发现了如何对它们进行升序或降序排序。

sort的结果应该等同于带有LIKE 'l%'的sql select语句,l作为参数给出。我可以使用Substring提取第一个字母,但我该如何使用它?感谢。

DataView dv= employees.DefaultView;
dv.Sort="ColumnName asc";
employees = dv.ToTable();

P.S。:还发现RowFilter属性,但我需要使用'排序'。

很抱歉第一次不太清楚。

2 个答案:

答案 0 :(得分:3)

您可以改为使用LINQ-To-DataTable

employees = employees.AsEnumerable()
    .OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault())
    .CopyToDataTable();

请注意,您需要在文件顶部添加using System.Linq

也许您发现查询语法更具可读性:

var rows = from row in employees.AsEnumerable()
           let value = row.Field<string>("ColumnName")
           orderby value.FirstOrDefault()
           select row;
employees = rows.CopyToDataTable();

更新“排序后,我只需选择以给定字母开头的那些”

然后您可能想要过滤记录,因此请使用Enumerable.Where

所以:

employees = employees.AsEnumerable()
    .Where(row => row.Field<string>("ColumnName").StartsWith("A", StringComparison.CurrentCultureIgnoreCase))
    .OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault())
    .CopyToDataTable();

或(查询语法相同):

var rows = from row in employees.AsEnumerable()
           let value = row.Field<string>("ColumnName")
           where value.StartsWith("A", StringComparison.CurrentCultureIgnoreCase)) // for example
           orderby value.FirstOrDefault()
           select row;
employees = rows.CopyToDataTable();

但是,现在orderby毫无意义,因为你想用第一个以相同字母开头的字母来记录记录。

答案 1 :(得分:0)

这是我以前使用的旧DataTable选择和排序包装器。现在我正在使用另一个将数据表转换为自定义对象的类,并且可以轻松使用linq。

public static class CTableManager
{
    public static DataTable Select(DataTable dt, string sFilter)
    {
        DataTable dtResult = dt.Clone();

        try
        {
            dtResult = dt.Select(sFilter).CopyToDataTable();
        }
        catch { }

        return dtResult;
    }

    public static DataTable Sort(DataTable dt, string sOrder)
    {
         DataTable dtResult = dt.Clone();

         try
         {
             dt.DefaultView.Sort = sOrder;

             dtResult = dt.DefaultView.ToTable().Copy();
         }
         catch { }

         return dtResult;
    }

     public static DataTable SelectAndSort(DataTable dt, string sFilter, string sOrder)
    {
        DataTable dtResult = dt.Copy();

        if (sFilter != string.Empty)
        {
            dtResult = Select(dtResult, sFilter);
        }

        if (sOrder != string.Empty)
        {
            dtResult = Sort(dtResult, sOrder);
        }

        return dtResult;
    }
}

用法:

SQL中过滤器的正常位置

var myResult = CTableManager.Select(dtSource,"itemDesc like '%plastic%' AND Price > 25.97");

再次排序SQL,如

 var myResult = CTableManager.Sort(dtSource,"Price DESC, Quantity ASC");

显然两者都是

var myResult = CTableManager.SelectAndSort(dtSource,"itemDesc like '%plastic%' AND Price > 25.97", "Price DESC, Quantity ASC");