2010-12-09 5 views
0

Ich hoffe, dass der Titel davon ziemlich geradlinig genug ist. Grundsätzlich habe ich eine Datenbank, in der die Volltextindizierung nicht installiert ist. Anstatt die Volltextindizierung zu installieren, habe ich mich gefragt, ob es eine Möglichkeit gibt, dies mit Linq zu tun?Sucheinrichtung wie CONTAINS oder FREETEXT mit Linq

Antwort

1

Sie können LINQ-Abfragen schreiben, die Instanzmethoden auf System.String verwenden. Die meisten LINQ-Provider können dies in SQL-Anweisungen konvertieren. Zum Beispiel:

from customer in db.Customers 
where customer.Name.Contains("foo") || customer.Name.Contains("bar") 
select customer; 

LINQ to Entities wird dies so zu etwas umwandeln:

SELECT T1.* 
FROM Customers T1 
WHERE T1.Name LIKE '%' + @p1 + '%' 
OR T1.Name LIKE '%' + @p2 + '%' 

Beachten Sie, dass, wenn Sie eine dynamische Anzahl von Wörtern müssen suchen, können Sie die PredicateBuilder verwenden. Damit können Sie Vergleichselemente erstellen, die ODER-Anweisungen enthalten. Das Umschreiben mit Gewerkschaften ist ebenfalls eine effektive Methode. Zum Beispiel:

string[] searchWords; 

// Define an empty set. 
var customers = 
    from customer in db.Customers 
    where false 
    select customer; 

// Union the empty set with a set for a word. 
foreach (var temp in searchWords) 
{ 
    var searchWord = temp; 

    customers = customers.Union(
     from customer in db.Customer 
     where customer.Name.Contains(searchWord) 
     select customer); 
} 
+0

Dies funktioniert nicht, wenn Sie 2 Wörter haben –

+1

Dies kann mit mehreren Wörtern arbeiten, aber wenn Sie eine dynamische Anzahl von Wörtern benötigen, müssen Sie die LINQ-Abfrage anders schreiben (mit Unionen zum Beispiel) oder verwenden Sie den PredicateBuilder: http: //www.albahari.com/nutshell/predicatebuilder.aspx. – Steven

+0

Das Problem mit dieser Antwort ist, dass ich nicht weiß, wie viele Schlüsselwörter durchkommen. Also, wenn ich 3 Schlüsselwörter habe, dann wird das eine verpassen. –

1

ich Sie glauben, sind nach so etwas wie:

from xx in table 
where uids.Contains(xx.uid.ToString()) 
select xx 

?

Wenn Sie nach eigenem String-Suche sind, vielleicht:

string input = "some String"; 
string[] toSearchFor = GetSearchStrings(); 
var containsAll = toSearchFor.All(x => input.Contains(x)); 
+0

+1 - schlagen Sie mich, um es .Alle re() ... Das heißt, ich glaube, dass diese allgemeine Lösung (versucht Freitextsuche zu emulieren) wird eine echte Ressource und Leistung hog für die sein OP. –

+0

Ich glaube nicht, dass LINQ to Entities in der Lage ist, den "All" -Operator zu handhaben. – Steven

Verwandte Themen