我有四个下拉列表,用于过滤/订购gridview。
如果前3个下拉列表中的任何一个具有除0以外的选定值,则WhereFlag设置为True。第四个下拉列表用于指定网格排序的列。
我的数据绑定gridview代码使用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未被用户代码处理。 Character Literal必须只包含一个字符
它指向Else fork中的查询AList。它与If fork中的查询之间的唯一区别是添加了Where子句......但是我无法推断出我的代码有什么问题。 AHA。
答案 0 :(得分:1)
错误指向评估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