ユーザーがテキストボックスに入力してリストをフィルタリングできるフォームがあります。2 つのフィールドに基づいてリストをフィルタリングする必要があります。FundName と CompanyName。フォームが読み込まれると、最初の LINQ to SQL の結果をリストに入れ、後続のすべてのアクション (フィルター) でデータベースがヒットしないようにします。これにより、処理速度が大幅に向上し (文字入力などのフィルター アクションあたり約 400 ミリ秒から 6 ミリ秒未満)、DB のチャタリングが減少します。
問題は、フィルター基準で 2 つのフィールドを検索することにしたときに、LINQ to Object クエリが機能しないことです。複数の 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()
すべてのヘルプと提案をいただければ幸いです。