2013-06-05 2 views
1

where 절에 여러 값이있는 LINQ 쿼리가 있습니다. where 절의 값은 filterbox from checkboxlist의 값입니다. Checkboxlist는 Null (또는 예를 들어 빈 문자열)을 반환 할 수 있습니다. 즉, checkboxlist에서 none을 선택하면 모두 선택한다는 의미로 쿼리에서 where 절이 필요하지 않습니다. 나는 그것을 처리 할 수있는 하나의 좋은 LINQ를 작성하는 방법을 몰랐다. 그래서 나는 아래와 같이 여러 개의 쿼리와 함께 여러 개의 IF 문을 사용했다. 나는 그것을 테스트했고 where 절에서 2 개의 매개 변수로 지금까지는 잘 작동한다. 그러나 실제로는 쿼리에 전달할 매개 변수가 더 많이 필요하며 해당 작업을 수행하기 위해 많은 IF 문이 있어야 지저분 해집니다. 하나의 좋은 LINQ 쿼리에서 어떻게 처리 할 수 ​​있습니까?여러 where 절을 사용하여 LINQ의 Null 값을 처리하는 방법

Function FilterCol(ByVal col As List(Of ProductDetails), Optional SelectedCategory As List(Of String) = Nothing, Optional SelectedBrand As List(Of String) = Nothing) As List(Of ProductDetails) 

    Dim strSelectedCategory As String = String.Join(",", SelectedCategory .ToArray()) 
    Dim strSelectedBrand As String = String.Join(",", SelectedBrand .ToArray()) 

    If strSelectedCategory = "" And strSelectedBrand = "" Then 
     Return col 
    ElseIf strSelectedCategory = "" Then 
     Dim res1 As IEnumerable(Of StatsDetails) = From x In col Where strSelectedBrand.Contains(x.Brand) Select x 
     Return res1.ToList 
    ElseIf strSelectedBrand = "" Then 
     Dim res2 As IEnumerable(Of StatsDetails) = From x In col Where strSelectedCategory.Contains(x.Category) Select x 
     Return res2.ToList 
    Else 
     Dim res As IEnumerable(Of StatsDetails) = From x In col Where strSelectedCategory.Contains(x.Category) And strSelectedBrand.Contains(x.Brand) Select x 
     Return res.ToList 
    End If 

End Function 
+0

NULL을 지정하면 DbNull 또는 VB의 Nothing이 발생합니까? –

답변

0

LINQ 쿼리에 대해 여러 조건이있는 경우 Dynamic LINQ Library을 사용해보십시오. 이를 통해 제공된 매개 변수를 기반으로 조건을 문자열 변수에 결합한 다음 LINQ 쿼리 조건으로 사용합니다. 이는 SQL Server의 동적 SQL과 유사합니다.

+0

감사합니다 DLinq 's COOL :> – lawphotog

0

확장 메서드 구문을 사용하면 더 쉽게 수행 할 수 있습니다. 하나의 LINQ 문을 사용하는 것이 좋다고 생각하지 않습니다.

먼저 수행 할 수있는 것은 테이블을 사용하여 기본 쿼리를 작성하는 것입니다. C#으로 할 것입니다. 그러나 VB로 번역하기가 복잡하지 않을 것입니다 - 나는 여러분이나 혼동을 혼동하고 싶지 않습니다!

var baseQuery = col; 

이제 기본 테이블을 얻었으므로 조건에 따라 wheres를 추가 할 수 있습니다.

if(condition1 == true) 
{ 
    baseQuery = baseQuery.Where(this is your where condition); 
} 

if(condition2 == true) 
{ 
    baseQuery = baseQuery.Where(this is another condition); 
} 

그래서, 당신은 당신의 Where 당신이 조건에 따라 쿼리를 좁힐 수 있도록 함께 s의 체인 수 있습니다.

마지막으로 ToList과 함께 쿼리 결과를 반환합니다. 이렇게하면 자신의 조건에서 코드 중복을 피할 수 있으며 모든 것을 이해하고 유지하기가 더 쉽습니다. 이 같은

0

사용 람다 특급 : 같은 아래의 값에 대한 LINQ에서 다음

Dim FnValueExists = 
     Function(v As String, a As List(Of String)) a Is Nothing OrElse 
                a.Count = 0 OrElse 
                a.Contains(v) 

, 그냥 테스트 :

Dim res As IEnumerable(Of StatsDetails) = 
        From x In col 
        Where FnValueExists(x.Category, SelectedCategory) And 
          FnValueExists(x.Brand, SelectedBrand) 
        Select x 

항목 x 선택 여부 될 경우 결정하는 주요 코드 , FnValueExists 람다 식의 행은 a Is Nothing OrElse a.Count = 0 OrElse a.Contains(v)입니다.

SelectedCategory 및/또는 SelectedBrand 목록이 Nothing이거나 비어 있거나 (개수 = 0) 값을 포함하면 항목이 계속 선택됩니다.

사용자가 카테고리를 선택하지 않은 경우 SelectedCategoryNothing 또는 빈 목록으로 설정할 수 있으므로 FnValueExists(x.Category, SelectedCategory)은 항상 true를 반환합니다.

관련 문제