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
Vous devez vous connecter pour publier un commentaire.
Si vous obtenez une exception NullReferenceException, il semble que ce soit FundName ou nom de la Société est null (Nothing). Essayez:
(La syntaxe peut être un peu hors sujet, mais j'espère que vous obtenez l'essentiel).
Chacun d'entre eux fonctionnent vraiment dans LINQ to Objects, sans se plaindre? Ce serait en effet étrange. Je m'attends à réussir dans LINQ to SQL, SQL n'a pas vraiment le concept d'une NullReferenceException.
OriginalL'auteur Jon Skeet