的DataTable.Select()函數,像這樣的過濾器返回錯誤的行...爲什麼DataTable.Select()返回錯誤的行?
「booleanColumn1和booleanColumn2和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()不像預期的那樣返回任何行。 – 2011-04-01 13:56:22