2008-09-15 10 views
5

Hat jemand eine gute Möglichkeit gefunden, Volltextsuchen (FREETEXT() CONTAINS()) für eine beliebige Anzahl von Stichwörtern mit der Standard LinqToSql-Abfragesyntax durchzuführen?LinqToSql und Volltextsuche - kann es getan werden?

Ich möchte natürlich vermeiden, einen Stored Proc zu verwenden oder eine Dynamic SQL-Aufrufe generieren müssen.

Offensichtlich konnte ich die Pumpe nur die Suchzeichenfolge in auf einem Parameter zu einem SPROC die FREETEXT-() verwendet, oder ENTHÄLT(), aber ich hatte gehofft, mehr Kreativität bei der Suche zu sein und aufzubauen Anfragen wie:

"Peperoni Pizza" und Burger, nicht "Apfelkuchen".

Verrückt ich weiß - aber wäre es nicht nett, in der Lage zu sein, dies direkt von LinqToSql zu tun? Irgendwelche Tipps, um dies zu erreichen, würden sehr geschätzt werden.

Update: Ich denke, ich auf etwas here ...

auch sein mag: Ich habe die Änderung auf meine Frage Titel gemacht rückgängig gemacht, weil es tatsächlich die Bedeutung geändert, was ich frage. I wissen, dass die Volltextsuche in LinqToSql nicht unterstützt wird - ich hätte diese Frage gestellt, wenn ich das wissen wollte. Stattdessen - Ich habe meinen Titel aktualisiert, um die Edit-Happy-Trigger-Fingered Massen zu beschwichtigen.

Antwort

4

Leider unterstützt LINQ to SQL die Volltextsuche nicht.

Es gibt eine Reihe von Produkten, die ich denke könnte: Lucene.NET, NHibernate Search kommt in den Sinn. LINQ für NHibernate kombiniert mit NHibernate Search würde wahrscheinlich diese Funktionalität geben, aber beide sind immer noch tief in der Beta.

+0

Hey Jon, danke dafür. Ich bin glücklich mit Ihrer Antwort im Prinzip und bin mir bewusst, dass ich eine weitere Ebene der Abstraktion hinzufügen könnte. Nicht ideal, dass Sie auch die CONTAINS() SPROC schreiben und Linq für alles andere verwenden können. Meine Frage ist "Kann es mit Linq gemacht werden"? Wenn nicht, dann reicht Ihre Antwort aus. – RobertTheGrey

+0

Ich habe mich dazu entschlossen, Lucene.NET zu verwenden und es funktioniert wirklich gut. Jetzt muss ich nur Memcached laufen lassen und ich werde kaum auf die DB treffen müssen ;-) – RobertTheGrey

5

Ich habe zu verwalten, dies zu umgehen, indem Sie eine Tabellenwertfunktion mit der Volltextsuche Komponente verkapseln, verwiesen sie dann in meinem LINQ Ausdruck die Vorteile der verzögerten Ausführung Aufrechterhaltung:

string q = query.Query; 
IQueryable<Story> stories = ActiveStories 
         .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o) 
         .Where (s => (query.CategoryIds.Contains(s.CategoryId)) && 
            /* time frame filter */ 
           (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) && 
           (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value))); 

Hier tvf_SearchStories 'ist die Tabellenwertfunktion, die intern die Volltextsuche verwendet