2008-11-12 7 views
4

Nous avons un formulaire qui permet à un utilisateur de filtrer une liste en tapant dans une zone de texte. Nous devons filtrer la liste en fonction de deux champs. Le FundName et le CompanyName. Lorsque le formulaire se charge, je place les résultats LINQ to SQL initiaux dans une liste afin que, pour chaque action (filtre) suivante, la base de données ne soit pas touchée. Cela accélère considérablement les choses (d'environ 400 millisecondes à moins de 6 millisecondes par action de filtre, comme la frappe d'un caractère) et réduit le bavardage de DB. Le problème est que lorsque nous avons décidé de faire la recherche de critères de filtre sur deux champs, la requête LINQ to Object ne fonctionne pas. Je peut avoir une requête qui a plusieurs critères seulement pas plusieurs LIKE (ou .Contains ou .Endswith etc. méthodes qui évaluent aux instructions SQL LIKE). La requête fonctionne contre le LINQtoSQL mais pas contre l'objet. Voici un exemple de code:LINQ to Objects: requête avec plusieurs conditions LIKE (OR ou AND) possible?

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 "Référence d'objet non définie sur 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 suggestion seraient grandement appréciées.

Répondre

7

Si vous obtenez une exception NullReferenceException, il semble que FundName ou CompanyName soit null (Nothing). Essayez:

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 

(La syntaxe peut être un peu loin, mais nous espérons que vous obtenez l'essentiel.)

+0

Ce fut tout. Bizarre cependant que je pourrais construire la requête avec un seul comme contre l'un ou l'autre champ (CompanyName ou FundName) sans avoir à vérifier les nulls. MERCI! –

+0

Est-ce que chacun d'entre eux travaillait vraiment dans LINQ to Objects sans se plaindre? Ce serait en effet étrange. Je m'attendrais à ce qu'il réussisse dans LINQ to SQL parce que SQL n'a pas vraiment le concept d'une exception NullReferenceException. –