过滤数据表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?
提前干杯
您可以使用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();