过滤DataTable c#

时间:2015-08-26 09:07:46

标签: c# datatable dataset filtering

我在DataTable中有内容需要过滤到3个特定列表。 它们都分别按照每组结果中的开始日期排序。 1天活动,2-13天活动和> 14天活动。

我已经尝试过使用DataTable.Select,但似乎这不像我预期的那样工作(不知道为什么我期望它)。

这就是我试过的

    DataTable allResults = ds.Tables["Items"];      
    DataTable set1 = new DataTable();
    DataTable set2 = new DataTable();
    DataTable set3 = new DataTable();

    DataRow[] result = allResults.Select("DATEDIFF(day,tcsi_startdate,tcsi_enddate) = 0");
    foreach (DataRow row in result)
    {
      set1.ImportRow(row);
    }
    result = allResults.Select("DATEDIFF(day,tcsi_startdate,tcsi_enddate) > 0 AND DATEDIFF(day,tcsi_startdate,tcsi_enddate) < 14");
    foreach (DataRow row in result)
    {
      set2.ImportRow(row);
    }
    result = allResults.Select("DATEDIFF(day,tcsi_startdate,tcsi_enddate) > 13");
    foreach (DataRow row in result)
    {
      set3.ImportRow(row);
    }

    set1.DefaultView.Sort = "tcsi_startdate";
    set2.DefaultView.Sort = "tcsi_startdate";
    set3.DefaultView.Sort = "tcsi_startdate";

在我需要使用DataTable.Select时,有什么方法可以对数据进行排序吗?

提前干杯

1 个答案:

答案 0 :(得分:4)

您可以使用LINQ-To-DataSet

var filtered = from row in allresults.AsEnumerable()
               let tcsi_startdate = row.Field<DateTime>("tcsi_startdate")
               let tcsi_enddate = row.Field<DateTime>("tcsi_enddate")
               let daysDiff = (tcsi_enddate - tcsi_startdate).Days 
               where daysDiff > 0 && daysDiff < 14
               select row;

如果要循环行,请使用foreach

foreach(DataRow row in filtered){...}

如果您想要DataTable的新IEnumerable<DataRow>

DataTable tblResult = filtered.CopyToDataTable();

请注意,如果过滤结果中没有行,则会引发异常。您可以通过检查if(filtered.Any()){...}确保这一点。

如果您想要DataRow[]

DataRow[] rowArray = filtered.ToArray();
// or a list:
List<DataRow> rowList = filtered.ToList();