2014-04-02 2 views
0

나는 gridview를 필터링/정렬하는 데 사용되는 4 개의 드롭 다운 목록이 있습니다.Dynamic Where 절의 Linq 동적 오류

처음 세 개의 드롭 다운 중 하나라도 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은 사용자 코드로 처리되지 않습니다. 문자 리터럴은 정확히 하나의 문자를 포함해야합니다.

Else 포크의 쿼리 AList를 가리 킵니다. If와 Where 포크의 쿼리 사이의 유일한 차이점은 Where 절이 추가되었지만 내 코드가 잘못되었음을 추론 할 수 없었습니다. 아하.

답변

1

오류는 LINQ 쿼리가 평가되는 곳을 가리키며 메시지에서 말한 것처럼 문제는 문자가 필요하지만 여러 문자가 제공된다는 것입니다.

ddl_AreaFilter.SelectedValue, ddl_SubAreaFilter.SelectedValue 또는 ddl_AllocFilter.SelectedValue에 실제로 문자 또는 문자열이 포함되어 있는지 확인하십시오. 그들은 더 이상의 문자를 포함하면 where 조건을 만들 때, 당신은 예를 들어, \"'를 교체해야합니다 :

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

편집

당신은 값의 유형이 각각 포함되어 있는지 확인해야합니다 SelectedValue 문자열이 해당 데이터베이스 유형과 일치해야합니다. 예를 들어 데이터베이스 열이 숫자 유형이면 문자열 내용이 숫자 유형으로 형변환됩니다.

따옴표를 사용하여 비교할 때 값을 지정하면 비교의 오른쪽에있는 형식이 문자 또는 문자열 (각각 작은 따옴표 나 큰 따옴표를 사용할 때마다 달라짐)임을 나타냅니다.

따라서 Area, SubAreaAllocation 유형은 데이터베이스에 있습니까?

  • 단일 문자 : 조회의 값이 작은 따옴표 주위해야한다 : Area = 'value'
  • 문자열 (예를 들어, varchar) : Area = "value"
  • 기타 : 당신은 따옴표를 사용해서는 안 큰 따옴표를 사용해야합니다 : Area = value
+0

jnovo 고마워요 ... 불행히도 귀하의 제안에 오류가 발생합니다. 문자열에서 유형으로 변환 Long이 유효하지 않습니다. 내 WhereBuild가 stringbuilder이고 연결되는 문자열이있는 버전을 사용해 보았습니다. 또한 VS2010에서 intellisence는 마지막 이스케이프 된 부분에 공백을 추가하여 & "\" "로 표시합니다.) – Mych

+0

설명을 위해 모든 드롭 다운에서 문자열 값을 제공합니다. – Mych

+0

@Mych이 사용자의 의견을 반영하여 답변을 업데이트했습니다. – jnovo