2016-05-05 7 views
0

Ich kratzte meinen Kopf für eine Stunde auf dieser gestern ohne Ergebnisse, aber Schweiß.Linq Where-Klausel, die nicht zurückgibt, was ich erwarte, wenn String.Contains (String) auf einer Null-Zeichenfolge

Dies gab mir alle meine MyClass DB-Datensätze, wie ich es erwarten würde.

string SearchTag = ""; 
Extension.getDBService<MyClass>().FindAll(i => <true condition> && i.TAG.ToLower().Trim().Contains(SearchTag.ToLower().Trim())); 

Dies ergab eine 0 Count-Sammlung! Ich verstehe das nicht.

string SearchTag = "e"; 
Extension.getDBService<MyClass>().FindAll(i => <true condition> && i.TAG.ToLower().Trim().Contains(SearchTag.ToLower().Trim())); 

Dies gibt eine Auflistung wieder, die alle MyClass DB-Datensätze enthält. Dies ist normal, da i.TAG immer "e" enthält.

Warum bekomme ich eine 0-Mitglieder-Sammlung mit dem zweiten Ausdruck? "String" .Contains ("") sollte immer wahr sein, oder?

PS: Extension.getDBService() ist übrigens ein Aufruf zu einem DBContext.

Danke für Ihre Unterstützung.

+0

Entfernen Sie und probieren Sie es aus –

+0

Sind Sie sicher, dass 'SearchTag' eine leere Zeichenfolge und keine' null' ist? Die beiden sind sehr unterschiedlich (in SQL wird "null" standardmäßig durch fast alle Operationen weitergegeben und ist "falsy"). Stellen Sie sicher, dass der Code, den Sie veröffentlichen, das von Ihnen beschriebene Verhalten anzeigt. Aber alles in allem gibt es wenig Grund für Sie, den Filter einzuschließen, wenn er nichts filtern soll - stellen Sie einfach Ihre Frage zusammen, anstatt alles in einen "FindAll" zu setzen, und Sie werden sich eine Menge Ärger ersparen :) – Luaan

+0

" String ".Contains (" ") sollte immer wahr sein, oder? - Ich denke nicht. es funktioniert wie es sein sollte, seit du nach einer leeren Zeichenfolge suchst. –

Antwort

3

Interessanterweise generiert die Art, wie Sie die LINQ-Abfrage geschrieben haben, SQL CHARINDEX(...) > 0 Kriterien, die für eine leere Zeichenfolge false zurückgibt.

Wenn Sie jedoch die ToLower().Trim() Teil der SearchTag Variable

SearchTag = SearchTag.ToLower().Trim(); 

und

i.TAG.ToLower().Trim().Contains(SearchTag) 

in der LINQ-Abfrage, dann werden die generierten SQL-Kriterien verwenden entfernen (außerhalb der Abfrage bewegen) ist LIKE Betreiber und funktioniert wie erwartet.

Nur ein weiteres Beispiel, dass LINQ to Entities ist nicht wie LINQ to Objects.

+0

Brillant finden Ivan. Es ist genau wie du gesagt hast :) Vielen Dank. –

Verwandte Themen