Linq 动态错误与动态 Where 子句



我有四个下拉列表,用于过滤/排序网格视图。

如果前 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.SelectedValueddl_SubAreaFilter.SelectedValueddl_AllocFilter.SelectedValue是否实际包含字符或字符串。如果它们包含多个字符,则应在构建where条件时将'替换为",例如:

WhereBuild.Append("Area = """ & ddl_AreaFilter.SelectedValue & """")

编辑

必须确保每个SelectedValue字符串中包含的值的类型与相应的数据库类型匹配。例如,如果数据库列是数值类型,则字符串内容将强制转换为数值类型。

使用引号

在比较中指定值时,表示比较右侧的类型是字符或字符串(分别取决于何时使用单引号或双引号)。

那么,数据库中的AreaSubAreaAllocation类型是什么?

  • 字符:查询中的值应围绕单引号:Area = 'value'
  • 字符串(例如,varchar):必须使用双引号:Area = "value"
  • 其他:那么你不应该使用引号:Area = value

相关内容

  • 没有找到相关文章

最新更新