gridviewのフィルター/順序付けに使用される4つのドロップダウンリストがあります。
最初の3つのドロップダウンのいずれかが0以外の選択された値を持つ場合、WhereFlagはTrueに設定されます。 4番目のドロップダウンは、グリッドを並べ替える列を指定するために使用されます。
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はユーザーコードによって処理されません。文字リテラルは正確に1文字を含む必要があります
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