过滤数据表 c#
Filtering DataTable c#
我在 DataTable 中有内容需要过滤到 3 个特定列表中。
在每组结果中,它们都将按开始日期分别排序。
1 天活动、2-13 天活动和 >14 天活动。
我试过使用 DataTable.Select,但它似乎不像我预期的那样像 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();
我在 DataTable 中有内容需要过滤到 3 个特定列表中。 在每组结果中,它们都将按开始日期分别排序。 1 天活动、2-13 天活动和 >14 天活动。
我试过使用 DataTable.Select,但它似乎不像我预期的那样像 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();