自定义选择C#中的DataTable列

本文关键字:DataTable 中的 选择 自定义 | 更新日期: 2023-09-27 18:21:58

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

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

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

附言:也找到了关于RowFilter属性的,但我需要使用"排序"。

很抱歉第一次讲得不太清楚。

自定义选择C#中的DataTable列

您可以改用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();

UPDATE"排序后,我只需要选择以给定字母开头的字母"

那么您可能想要过滤记录,因此使用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是毫无意义的,因为您希望按第一个字母排序记录,这些记录都以同一个字母开头。

这里是我以前使用的一个旧的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 中的正常where过滤器

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");