2008-11-12 3 views
4

우리는 사용자가 텍스트 상자에 입력하여 목록을 필터링 할 수있는 양식을 가지고 있습니다. 두 개의 필드를 기반으로 목록을 필터링해야합니다. FundName 및 CompanyName. 폼이로드 될 때마다 모든 후속 작업 (필터)에 대해 데이터베이스가 손상되지 않도록 SQL LINQ를 SQL 결과에 나열합니다. 이렇게하면 작업 속도가 크게 빨라지고 (문자 입력과 같이 필터 동작 당 약 400 밀리 초에서 6 밀리 초 미만으로) DB 채터 링이 줄어 듭니다.LINQ to Objects : 여러 LIKE 조건 (OR 또는 AND)이 가능한 쿼리가 가능합니까?

문제는 필터 조건을 두 필드를 통해 검색 할 때 LINQ to Object 쿼리가 작동하지 않는다는 것입니다. I 은 복수 기준이 이 아니고이 아닌 여러 LIKE (또는 SQL LIKE 문으로 평가되는 .Contains 또는 .Endswith 등의 방법) 쿼리를 가질 수 있습니다. 쿼리는 LINQtoSQL에 대해 객체에 대해 작동하지 않습니다. 다음은 몇 가지 샘플 코드입니다.

Dim db As New BenchmarkLINQtoSQLDataContext() 

Dim fundList = From FundShort In db.FundShorts _ 
Select FundShort _ 
Order By FundShort.IRBB 

Dim linqFundShortList As New List(Of FundShort) 
linqFundShortList = fundList.ToList() 

Dim filterText = "aka" 


'This works 
Dim successQuery = From fs In fundList _ 
     Where fs.FundName.ToLower.Contains(filterText) _ 
     Or fs.CompanyName.ToLower.Contains(filterText) _ 
     Select fs 

FundBindingSource.DataSource = successQuery 

'This also works 
Dim successQuery2 = From fs In linqFundShortList _ 
     Where fs.FundName.ToLower.Contains(filterText) _ 
     Select fs 

FundBindingSource.DataSource = successQuery2 

'This does not 
Dim failQuery = From fs In linqFundShortList _ 
     Where (fs.FundName.ToLower.Contains(filterText) _ 
     Or fs.CompanyName.ToLower.Contains(filterText)) _ 
     Select fs 

FundBindingSource.DataSource = failQuery 

예외는 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."입니다. - 스택 추적은 다음과 같습니다.

at Benchmark.BPRMS.FundsMain._Closure$__1._Lambda$__3(FundShort fs) in 
    C:\Projects\BPRMS\Trunk\BPRMS\Forms\FundsMain.vb:line 72 
    at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext() 
    at System.Linq.SystemCore_EnumerableDebugView`1.get_Items() 

모든 도움과 제안을 주시면 감사하겠습니다.

답변

7

NullReferenceException이 발생하는 경우 FundName 또는 CompanyName이 null (Nothing) 인 것처럼 들립니다.

Dim failQuery = From fs In linqFundShortList _ 
    Where (((Not fs.FundName Is Nothing) AndAlso fs.FundName.ToLower.Contains(Me.filterText))_ 
    OrElse ((Not fs.CompanyName Is Nothing) AndAlso fs.CompanyName.ToLower.Contains(Me.filterText))) _ 
    Select fs 

(구문이 약간 떨어져있을 수 있습니다, 그러나 희망 당신은 요점을 얻을.)를

+0

했다 :보십시오. 이상하게도 null을 확인하지 않고도 필드 (CompanyName 또는 FundName)와 같은 단일 쿼리를 작성할 수 있습니다. 감사! –

+0

그들 각각은 불평하지 않고 LINQ to Objects에서 실제로 작동 했습니까? 그것은 참으로 이상 할 것입니다. 나는 LINQ to SQL에서 SQL이 실제로 NullReferenceException 개념을 갖고 있지 않기 때문에 성공할 것으로 기대한다. –