4

ユーザーがテキストボックスに入力してリストをフィルタリングできるフォームがあります。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()

すべてのヘルプと提案をいただければ幸いです。

4

1 に答える 1

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

(構文は少しずれているかもしれませんが、要点を理解していただければ幸いです。)

于 2008-11-12T19:47:03.867 に答える