2014-04-02 120 views
0

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

回答

1

错误指向评估LINQ查询的地方,并且如消息所示,问题在于预期会出现字符,但提供了多个字符。

每当检查ddl_AreaFilter.SelectedValue,ddl_SubAreaFilter.SelectedValueddl_AllocFilter.SelectedValue实际上包含一个字符或一个字符串。如果它们包含多个字符,你应该建立where条件时\"更换',例如:

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

编辑

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

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

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

  • 单个字符:在查询的价值应该在单引号:Area = 'value'
  • 字符串(例如,varchar):你必须用双引号:Area = "value"
  • 其他:那么你应该使用无报价:Area = value
+0

jnovo谢谢......不幸的是,你的建议给出了一个错误从字符串转换为长类型是无效的。我试过了一个版本,其中我的WhereBuild是一个字符串构建器,另一个是我连接到的一个字符串。在VS2010中,intellisence为最后转义部分增加空格,使其显示为&“\”“) – Mych

+0

说明所有下拉列表提供字符串值 – Mych

+0

@Mych在您的评论后更新了答案。 – jnovo