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.
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! –
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. –