我要更改程序以根据一系列值过滤数据。
虽然效率不高,但信息会在指定的时间段内加载到内存中,并根据一些单独处理的标准进行过滤,无论是生成CSV报告。
将信息加载到DataView
中,然后根据正在处理的操作对其进行过滤。每三个进程处理此DataView
的子集。然后通过DataView.RowFilter
属性过滤器确定子集。
根据我到目前为止发现的内容,适用于RowFilter
的{{3}}似乎充分利用了SQL where
子句语法,如下所示。
dataView.RowFilter = "Id = 999";
dataView.RowFilter = "Name like 'Stack%'"
dataView.RowFilter = "Id in (1, 2, 3, 10, 16, 34)"
dataView.RowFilter = "Amount < 5000"
如本帖所述:DataColumn.Expression
。
现在我想知道,在DataView.RowFilter
属性支持SQL DataView RowFilter Syntax [C#]条件的情况下,是否存在遗留的不易测试代码?
这是一个有效的DataColumn.Expression
申请DataView.RowFilter
吗?
dataView.RowFilter = "Name = 'StackOverflow' and Amount between 5000 and 5999";
答案 0 :(得分:1)
如果我没记错,Between
不被支持,但为什么不简单:
dataView.RowFilter = "Name = 'StackOverflow' and Amount >= 5000 and Amount <= 5999";
MSDN:仅提及Between
作为重新保留的字词,但表达式中不支持此字段。
我已对其进行了测试,并使用BETWEEN
引发EvaluateException
:
{“表达式包含不支持的运算符'Between'。”}
这是测试代码,样本数据:
DataTable table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Amount", typeof(int));
table.Rows.Add("Site1", 1000);
table.Rows.Add("OtherSite", 3000);
table.Rows.Add("StackOverflow", 5100);
table.Rows.Add("StackOverflow", 5500);
table.Rows.Add("StackExchange", 5900);
var dataView = table.DefaultView;
首先,使用AND
的有效表达式:
dataView.RowFilter = "Name = 'StackOverflow' and Amount >= 5000 and Amount <= 5999";
Console.Write("Count: {0}\r\nValues:\r\n{1}"
, dataView.Count
, string.Join(Environment.NewLine, dataView.Cast<DataRowView>()
.Select(o => string.Join(",", o.Row.ItemArray))));
输出:
Count: 2
Values:
StackOverflow,5100
StackOverflow,5500
现在使用BETWEEN
的无效语法:
dataView.RowFilter = "Name = 'StackOverflow' and Amount BETWEEN 5000 and 5999"; // boom