LinQ Contains - Performance
-
Hallo,
ich habe eine View mit ca. 1.5 Mio. Datensätzen. Mit LIKE '%%' auf mehrere Spalten wird die Abfrage deutlich langsam.
Meine Abfrage sieht in SQL ungefähr so aus
Select a,b,c,d,e,f FROM ViewX WHERE ISNULL(a,'') LIKE '%%' AND ISNULL(b,'') LIKE '%%' AND ISNULL(c,'') LIKE '%%' AND ISNULL(d,'') LIKE '%%' AND ISNULL(e,'') LIKE '%%' AND ISNULL(f,'') LIKE '%%' AND
in LinQ ungefähr so (hab hier jetzt nur das Contains auf 'a' dargestellt). Die Spalten 'b' -'f' könnt ihr euch dazu denken
from output in DataContext.ViewX where (string.IsNullOrEmpty(_a) ? (output.a== null || output.a.Contains(_a)) : output.a.Contains(_a))
Die Abfrage dauert nun über 10 sek. Gibt es an dieser Stelle noch eine Möglichkeit die Datenabfrage zu beschleunigen?
-
Welches SQL-Query wird denn daraus erzeugt? Sonderlich schön schaut das jedenfalls nicht aus...bin aber leider kein LINQ-Experte, müsste ich mir erst genauer ansehen.
MfG SideWinder
-
(string.IsNullOrEmpty(_a) ? (output.a== null || output.a.Contains(_a)) : output.a.Contains(_a))
dieses Statement soll quasi die ISNULL-Methode in SQL simulieren und bezwecken, dass auch Datenfelder mit NULL zurückgegeben werden, wenn der übergebene String leer ist.
Die eigentliche Frage ist aber, wie man das CONTAINS mit Wildcards schneller machen kann. Das dauert ja selbst auf dem SQL Server so lange, um das Statement auszuführen. Ich gehe mal davon aus, dass ich hier nicht um die Volltextsuche herumkomme.