gpt4 book ai didi

.net - 为什么 DataTable.Select() 返回错误的行?

转载 作者:行者123 更新时间:2023-12-02 13:53:46 28 4
gpt4 key购买 nike

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”是否是 bool 列的正确语法)。但也可以很容易地将责任归咎于 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);

最佳答案

这绝对是一个错误,而且看起来已经存在很长时间了。我发现this knowledgebase article描述了 .Net Framework 1.1 中完全相同的错误。

似乎第二个条件被完全忽略,因为我发现以下变体也返回一行:

dt.Select("B AND false AND ID = '00000000-0000-0000-0000-000000000000'")
dt.Select("B AND 0 AND ID = '00000000-0000-0000-0000-000000000000'")

然而,这正确地返回 0 行:

dt.Select("B AND A AND A AND ID = '00000000-0000-0000-0000-000000000000'")

关于.net - 为什么 DataTable.Select() 返回错误的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504253/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com