这是我的代码的熊骨版本,用于演示错误(VB):
Dim tbl As New DataTable
tbl.Columns.Add("StringColumn", GetType(String))
tbl.Columns.Add("GuidColumn", GetType(Guid))
tbl.Columns.Add("IntColumn", GetType(Integer))
'Comment this line out and it works!
tbl.PrimaryKey = New DataColumn() {tbl.Columns("GuidColumn")}
Dim guid1 As Guid = Guid.NewGuid
tbl.Rows.Add("Value1", guid1, Nothing)
Dim filter1 As String = "( [GuidColumn] = CONVERT('" & guid1.ToString & "',System.Guid) )"
Dim filter2 As String = "( NOT IsNull([StringColumn],'')='' AND NOT [IntColumn] IS NULL )"
Dim filter3 As String = filter1 & " AND " & filter2
Dim rows1 = tbl.Select(filter1) '1 rows
Dim rows2 = tbl.Select(filter2) '0 rows
Dim rows3 = tbl.Select(filter3) '1 rows (should be 0 rows)
......但它已经坏了。 (在.NET 4 SP1中运行)
Filter1的计算结果为True(这是PK上的过滤器)
Filter2评估为False
Filter1 AND Filter 2评估为......真!什么!!
这似乎是由于Data关键字的主键列上的NOT关键字和过滤的组合。 但是我无法弄清楚为什么会破坏它的确切规则。
对我来说,这就像ADO.NET中的一个错误,任何人都可以确认和/或建议解决方法。
非常感谢,
Mike G