我有四个下拉列表,用于过滤/排序网格视图。
如果前 3 个下拉列表中的任何一个具有 0 以外的选定值,则 WhereFlag 设置为 True。第四个下拉列表用于指示网格按哪一列排序。
我用于网格视图的数据绑定的代码使用 System.Linq.Dynamic 并如下所示...
Dim dc As New DiaryDataContext
If WhereFlag = False Then
'This section works...
Dim AList = dc.D_AreaSubAreas _
.OrderBy(ddl_SortBy.SelectedValue)
Dim dl As List(Of D_AreaSubArea)
dl = AList.ToList
dl.Insert(0, New D_AreaSubArea With {.Ref = 0,
.Area = "",
.SubArea = "",
.Allocation = "Allocation...",
.Redundant = False})
gv_AreaSubArea.DataSource = dl
gv_AreaSubArea.DataBind()
'Gridview successfully binds
'If ddl_SortBy value is changed... Gridview binds OK.
Else
'This section gives error...
Dim WhereBuild As New StringBuilder
If ddl_AreaFilter.SelectedIndex <> 0 Then
WhereBuild.Append("Area = '" & ddl_AreaFilter.SelectedValue & "'")
AndFlag = True
End If
If ddl_SubAreaFilter.SelectedIndex <> 0 Then
If AndFlag = True Then
WhereBuild.Append(" AND ")
End If
WhereBuild.Append("SubArea = '" & ddl_SubAreaFilter.SelectedValue & "'")
AndFlag = True
End If
If ddl_AllocFilter.SelectedIndex <> 0 Then
If AndFlag = True Then
WhereBuild.Append(" AND ")
End If
WhereBuild.Append("Allocation = '" & ddl_AllocFilter.SelectedValue & "'")
End If
'ERROR HERE
Dim AList = dc.D_AreaSubAreas _
.Where(WhereBuild.ToString) _
.OrderBy(ddl_SortBy.SelectedValue)
'END ERROR
Dim dl As List(Of D_AreaSubArea)
dl = AList.ToList
dl.Insert(0, New D_AreaSubArea With {.Ref = 0,
.Area = "",
.SubArea = "",
.Allocation = "Allocation...",
.Redundant = False})
gv_AreaSubArea.DataSource = dl
gv_AreaSubArea.DataBind()
End If
我得到的错误是动态 where 子句。我得到的错误是
ParseException 不由用户代码处理。字符文本必须只包含一个字符
它指向 Else 分支中的查询 AList。它和 If 分叉中的查询之间的唯一区别是添加了 Where 子句......但是我一直无法推断出我的代码出了什么问题。啊哈。
错误指向计算 LINQ 查询的位置,正如消息所述,问题在于需要某个字符,但提供了多个字符。
检查ddl_AreaFilter.SelectedValue
、ddl_SubAreaFilter.SelectedValue
或ddl_AllocFilter.SelectedValue
是否实际包含字符或字符串。如果它们包含多个字符,则应在构建where
条件时将'
替换为"
,例如:
WhereBuild.Append("Area = """ & ddl_AreaFilter.SelectedValue & """")
编辑
必须确保每个SelectedValue
字符串中包含的值的类型与相应的数据库类型匹配。例如,如果数据库列是数值类型,则字符串内容将强制转换为数值类型。
在比较中指定值时,表示比较右侧的类型是字符或字符串(分别取决于何时使用单引号或双引号)。
那么,数据库中的Area
、SubArea
和Allocation
类型是什么?
- 单
- 字符:查询中的值应围绕单引号:
Area = 'value'
- 字符串(例如,
varchar
):必须使用双引号:Area = "value"
- 其他:那么你不应该使用引号:
Area = value