我有四個下拉列表,用於過濾/排序gridview。
如果前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子句...,但是我無法推斷出我的代碼出了什麼問題。 AHA。
該錯誤指向評估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