动态Where子句的Linq动态错误

时间:2014-04-02 12:01:02

标签: vb.net linq dynamic-linq

我有四个下拉列表,用于过滤/订购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。

1 个答案:

答案 0 :(得分:1)

错误指向评估LINQ查询的位置,并且正如消息所示,问题是需要一个字符但是提供了几个字符。

每当ddl_AreaFilter.SelectedValueddl_SubAreaFilter.SelectedValueddl_AllocFilter.SelectedValue实际包含字符或字符串时,请检查。如果它们包含多个字符,则应在构建'条件时将\"替换为where,例如:

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

修改

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

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

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

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