LINQ enthält eine übereinstimmung von array von strings
Schwierigkeiten haben, diese zu arbeiten:
///<summary>
///Retrieve search suggestions from previous searches
///</summary>
public static string[] getSearchSuggestions(int SectionID, string Query)
{
string[] Suggestions;
string[] Words = Query.Split(' ');
using (MainContext db = new MainContext())
{
Suggestions = (from c in db.tblSearches
where c.SectionID == SectionID &&
Words.Any(w => c.Term.Contains(w))
select c.Term).ToArray();
}
return Suggestions;
}
Bekomme ich:
System.NotSupportedException: Lokale Sequenz nicht verwendet werden, in LINQ to SQL-Implementierungen von query-Operatoren mit Ausnahme der operator "Enthält" verwendet.
Ich möchte die Datensätze zurückgeben, in denen das Feld c.Term
enthält eines der Wörter in der Words
array. Ich würde auch gerne bestellt, durch die Gesamtzahl der Spiele, aber das scheint wirklich schwer zu tun! Ich fand dieser MSDN. Aber ich kann es nicht zu funktionieren mit meinem query. Auch dies fand aber es funktioniert nicht.
- Diese syntax sieht gut aus für mich. Ich portiert es zu einigen lokalen code und war in der Lage, eine identische Abfrage gegen eine meiner eigenen Kontexte. (mit framework 3.5)
- Ich bin auf der 4-framework und dieses den Fehler auslöst zitiert 🙁
- Ist c.Begriff nur einen einfachen string-Wert?
- ja, es ist vom Datentyp nvarchar(60)
- Ist es eine Zeichenfolge mit mehr als einem Wort in ihm?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, nach dem einstecken entfernt genug, ich erkannte, dass das problem war nicht das eines oder das Enthält. Linq to SQL nicht wie Sie die Kombination der lokalen Sequenz (Wörter) mit der SQL-Auflistung (db.tblSearches). So, um dies zu erreichen, müssen Sie es zu brechen in 2 separate Abfragen.
Beachten Sie, dass in der zweiten Abfrage, die
Contains
groß-und Kleinschreibung, so dass Sie möglicherweise haben, um eine case-insensitive-Erweiterung Methode oder gehen alte Schule und treten Sie.ToUpper()
. Ich lief diese in 4.0 auf einem meiner Kontexte und er kehrte alle 88 strings korrekt (aus 9814). Es war zwar eine Gründliche PITA. Definitiv +1 auf diese Frage.Edit:
Hinzugefügt
.Distinct()
die endgültige Antwort.where a.ToLower().Contains(w.ToLower())
scheint es case-insensitiv.select a).Distinct().ToArray();
für verschiedene, kombiniert mit Kleinbuchstaben ist die perfekte Antwort 😀 thanks a million!.ToArray()
nach derall
variable - Warum lassen Sie es nicht faul bleiben, bis es gebraucht wird? Mit Ihrem aktuellen code-Beispiel, es wird die Iteration durch die Elemente auf.ToArray()
, und dann wieder in dieSuggestions
..ToArray()
gewinnen und ein bisschen die Leistung als gut. Als ich dabei war meine Tests, die ich war versucht zu halten, den Typen zu beseitigen, die als ein mögliches problem.Zuerst konvertieren Sie das array zu einer Liste,
dann ändern Sie Ihre linq-Abfrage wie folgt:
Ich glaube, ich sehe dein problem aber. In der ursprünglichen Abfrage, die Sie verwenden.c.Begriff.Enthält()... Enthält, ist eine Erweiterung Methode muss aufgerufen werden, auf ein Objekt, das Enumerable implementiert, so dass Sie es nicht nennen, auf einem Feld, das Sie wieder aus der Datenbank aufrufen. Das ist, warum die anderen user, die Ihre Frage beantwortet hat, sagte Sie benötigt, um flip-Dinge, um in Ihrem Enthält, weil Sie nie gehen zu lassen, Sie machen diesen Anruf auf c.Bedingungen.
Müssen Sie drehen Sie Ihr um die Contains-Klausel: