【发布时间】:2011-03-31 18:01:44
【问题描述】:
DataTable.Select() 函数使用这样的过滤器返回错误的行...
“booleanColumn1 AND booleanColumn2 AND GuidColumn1 = '00000000-0000-0000-0000-000000000000')”
对此格式进行几乎任何更改都会修复它(参见示例)。在 dataView 上使用相同的过滤器可以正常工作。我很想把它改成
“booleanColumn1 = 1 AND booleanColumn2 = 1 AND GuidColumn1 = '00000000-0000-0000-0000-000000000000')”
并声明它已修复(文档没有提及“A”或“A = 1”是否是布尔列的正确语法)。但责任也很容易归咎于 Guid 专栏。在我重新访问我们在代码库中使用 DataTable.Select() 的数百个地方之前,我希望看看是否有人知道真正发生了什么。
DataTable dt = new DataTable("dt");
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("ID", typeof(Guid)),
new DataColumn("A", typeof(bool)),
new DataColumn("B", typeof(bool))
});
dt.Rows.Add(Guid.Empty, false, true);
// this incorrectly returns a row
Debug.WriteLine(dt.Select("B AND A AND ID = '00000000-0000-0000-0000-000000000000'").Length);
// yet it's fine for a DataView (correctly returns 0 rows)
DataView dv = new DataView(dt);
dv.RowFilter = "B AND A AND ID = '00000000-0000-0000-0000-000000000000'";
Debug.WriteLine(dv.Count);
// these correctly return 0 rows
Debug.WriteLine(dt.Select("B AND A").Length);
Debug.WriteLine(dt.Select("B AND A AND CONVERT(ID, 'System.String') = '00000000-0000-0000-0000-000000000000'").Length);
Debug.WriteLine(dt.Select("A AND B AND ID = '00000000-0000-0000-0000-000000000000'").Length);
Debug.WriteLine(dt.Select("B = 1 AND A AND ID = '00000000-0000-0000-0000-000000000000'").Length);
Debug.WriteLine(dt.Select("ID = '00000000-0000-0000-0000-000000000000' AND B AND A").Length);
Debug.WriteLine(dt.Select("B AND (A AND ID = '00000000-0000-0000-0000-000000000000')").Length);
// still wrong
Debug.WriteLine(dt.Select("B AND A AND ID = '00000000-0000-0000-0000-000000000000'").Length);
【问题讨论】:
-
这个问题的一个有趣特性是,如果您重新排列 DataTable 中的列,查询会返回不同的结果。我尝试将 ID 列从 DataTable 中的第一列移动到第三列,并且第一个 Select() 没有返回任何行,正如预期的那样。
标签: .net select datatable dataview rowfilter