우리는 사용자가 텍스트 상자에 입력하여 목록을 필터링 할 수있는 양식을 가지고 있습니다. 두 개의 필드를 기반으로 목록을 필터링해야합니다. 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()
모든 도움과 제안을 주시면 감사하겠습니다.
했다 :보십시오. 이상하게도 null을 확인하지 않고도 필드 (CompanyName 또는 FundName)와 같은 단일 쿼리를 작성할 수 있습니다. 감사! –
그들 각각은 불평하지 않고 LINQ to Objects에서 실제로 작동 했습니까? 그것은 참으로 이상 할 것입니다. 나는 LINQ to SQL에서 SQL이 실제로 NullReferenceException 개념을 갖고 있지 않기 때문에 성공할 것으로 기대한다. –