VB.NET中如何结合FirstOrDefault实现DataTable多条件查询
DataTable多条件查询问题修复方案
问题排查
- 你当前的
dt.Select写法错误:用了VB的And运算符连接两个字符串,但DataTable的过滤条件需要是单个完整的SQL风格字符串,正确做法是把条件用AND拼接成一个字符串。 - 新增的ColorCode和Size变量没有加入查询条件,这是你要实现的功能但没落实。
- 直接拼接字符串存在风险:如果输入内容包含单引号(比如
O'Neil),会导致过滤语句报错。
修复后的完整代码
Private Sub process() Dim Barcode = TextBox1.Text.Trim() Dim CodeProduct = TextBox2.Text.Trim() Dim ColorCode = "test" ' 替换成你的实际输入控件值,比如TextBox3.Text.Trim() Dim Size = "test" ' 替换成你的实际输入控件值,比如TextBox4.Text.Trim() Dim row As DataRow = Nothing ' 用来存储有效查询条件 Dim conditions As New List(Of String)() ' 非空条件才加入,避免空文本干扰查询 If Not String.IsNullOrEmpty(Barcode) Then ' 转义单引号,防止语法错误 conditions.Add($"Barcode = '{Barcode.Replace("'", "''")}'") End If If Not String.IsNullOrEmpty(CodeProduct) Then conditions.Add($"CodeProduct = '{CodeProduct.Replace("'", "''")}'") End If If Not String.IsNullOrEmpty(ColorCode) Then conditions.Add($"ColorCode = '{ColorCode.Replace("'", "''")}'") End If If Not String.IsNullOrEmpty(Size) Then conditions.Add($"Size = '{Size.Replace("'", "''")}'") End If ' 有数据且有条件时执行查询 If dt.Rows.Count > 0 AndAlso conditions.Count > 0 Then Dim filterString = String.Join(" AND ", conditions) row = dt.Select(filterString).FirstOrDefault() ElseIf conditions.Count = 0 Then ' 无查询条件时的处理,比如返回第一条数据,可按需调整 row = dt.Rows.Cast(Of DataRow).FirstOrDefault() End If ' 这里添加找到row后的业务逻辑,比如更新Qty、绑定到网格等 End Sub
核心说明
- 条件按需添加:只有当输入框有内容时,才把对应字段加入查询条件,避免用户未输入时过滤掉所有数据。
- 单引号转义:用
Replace("'", "''")处理输入中的单引号,避免破坏过滤语句的字符串结构。 - 正确拼接过滤语句:用
String.Join把所有条件用AND连接成符合DataTable要求的过滤字符串。 - 空条件处理:当所有查询条件都为空时,可根据业务需求返回第一条数据或空值,代码中给出的是返回第一条的示例。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

