LINQ to Objects: Requête avec plusieurs conditions (OU ou ET) possible?

Nous avons un formulaire qui permet à l'utilisateur de filtrer une liste en tapant dans la zone de texte. Nous avons besoin de filtrer la liste en fonction de deux champs. Le FundName et le nom de la Société. Lors du chargement du formulaire j'ai mis la première LINQ to SQL résultats dans une liste, de sorte que pour chaque action (filtre) de la base de données n'est pas atteint. Cela accélère les choses de manière significative (à partir d'environ 400 millisecondes à moins de 6 millisecondes par action de filtrage, telles que la saisie d'un caractère) et réduit DB chatter.

Le problème est que lorsque nous avons décidé de faire les critères de filtre de recherche sur deux champs de LINQ pour Objet de requête ne fonctionne pas. Je peut avoir une requête qui a plusieurs critères qui viennent d'être pas multiples (ou .Contient ou .Endswith etc. les méthodes qui permettent d'évaluer à SQL COMME consolidés). La requête fonctionne à l'encontre de la LINQtoSQL tout simplement pas à l'encontre de l'objet. Voici un exemple de code:

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

L'exception est "la référence d'Objet n'est pas définie à une instance d'un objet." - la trace de la pile est:

   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()

Toute aide et suggestions seraient grandement appréciés.

OriginalL'auteur Steve Bargelt | 2008-11-12