我有一个四个下拉列表,用于过滤/命令gridview。动态Linq动态错误Where子句
如果前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由用户代码未处理。字符文字必须正好包含一个字符
它指向查询AList在Else fork中。它与If分支中查询的唯一区别是Where子句的添加...但我一直无法推断我的代码出了什么问题。 AHA。
jnovo谢谢......不幸的是,你的建议给出了一个错误从字符串转换为长类型是无效的。我试过了一个版本,其中我的WhereBuild是一个字符串构建器,另一个是我连接到的一个字符串。在VS2010中,intellisence为最后转义部分增加空格,使其显示为&“\”“) – Mych
说明所有下拉列表提供字符串值 – Mych
@Mych在您的评论后更新了答案。 – jnovo