过滤数据表c#

本文关键字:数据表 过滤 | 更新日期: 2023-09-27 18:09:48

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

我试过使用DataTable。选择,但似乎这并不像我所期望的SQL那样工作(不知道为什么我期望它)。

这是我尝试过的

    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?

提前干杯

过滤数据表c#

您可以使用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){...}

如果您想从IEnumerable<DataRow>中获得一个新的DataTable:

DataTable tblResult = filtered.CopyToDataTable();

注意,如果过滤的结果中没有行,则会抛出异常。您可以通过检查if(filtered.Any()){...}来确保。

如果你想要一个DataRow[]:

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