Ich habe eine große Frage.
Ich habe eine Linq-Abfrage, um es einfach so auszudrücken:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Die Werte des string[]
Arrays wären Zahlen wie (1,45,20,10 usw.)
Die Standardeinstellung für .Contains
ist .Contains(string)
.
Ich brauche es stattdessen, um dies zu tun: .Contains(string[])
...
BEARBEITEN: Ein Benutzer schlug vor, eine Erweiterungsklasse für zu schreiben string[]
. Ich würde gerne lernen wie, aber jemand, der bereit ist, mich in die richtige Richtung zu weisen?
EDIT: Die UID wäre auch eine Nummer. Deshalb wird es in einen String konvertiert.
Jemandem helfen?
Antworten:
Spoulson hat es fast richtig, aber Sie müssen eine
List<string>
vonstring[]
zuerst erstellen . EigentlichList<int>
wäre a besser wenn uid auch istint
.List<T>
unterstütztContains()
. Diesuid.ToString().Contains(string[])
würde bedeuten, dass die UID als Zeichenfolge alle Werte des Arrays als Teilzeichenfolge enthält. Selbst wenn Sie die Erweiterungsmethode geschrieben hätten, wäre der Sinn falsch.[BEARBEITEN]
Wenn Sie es nicht geändert und geschrieben haben,
string[]
wie Mitch Wheat demonstriert, können Sie den Konvertierungsschritt einfach überspringen.[ENDEDIT]
Folgendes möchten Sie, wenn Sie die Erweiterungsmethode nicht ausführen (es sei denn, Sie haben bereits die Sammlung potenzieller Uids als Ints - verwenden Sie
List<int>()
stattdessen einfach ). Dies verwendet die verkettete Methodensyntax, die meiner Meinung nach sauberer ist, und führt die Konvertierung in int durch, um sicherzustellen, dass die Abfrage mit mehr Anbietern verwendet werden kann.quelle
List<int>
stattdessen die Sammlung im Speicher erstellen und denToString
Aufruf überspringen .Wenn Sie Contains wirklich replizieren möchten , aber ein Array suchen , finden Sie hier eine Erweiterungsmethode und einen Beispielcode zur Verwendung:
quelle
!string.IsNullOrEmpty(str)
Prüfung bestanden wurde und dievalues.Length > 0
Bedingung ignoriert wurde , die Länge der Werte jedoch 0 war , wurde sie an die gesendetforeach
und sofort unterbrochen, da das Array keine Einträge enthält und direkt an diereturn false
.Versuche Folgendes.
quelle
LINQ in .NET 4.0 bietet eine weitere Option für Sie. die .Any () -Methode;
quelle
Any()
undAll()
Methoden sind so einfach :) Ich kann verwendent => words.All(w => t.Title.Contains(w))
.Oder wenn Sie die Daten bereits in einer Liste haben und das andere Linq-Format bevorzugen :)
quelle
Wie wäre es mit:
quelle
Dies ist ein Beispiel für eine Möglichkeit, eine Erweiterungsmethode zu schreiben (Hinweis: Ich würde dies nicht für sehr große Arrays verwenden; eine andere Datenstruktur wäre besser geeignet ...):
quelle
Dies ist eine späte Antwort, aber ich glaube, dass sie immer noch nützlich ist .
Ich habe das NinjaNye.SearchExtension- Nuget-Paket erstellt, das zur Lösung dieses Problems beitragen kann:
Sie können auch mehrere Zeichenfolgeneigenschaften durchsuchen
Oder führen Sie eine
RankedSearch
Rückgabe durch,IQueryable<IRanked<T>>
die einfach eine Eigenschaft enthält, die angibt, wie oft die Suchbegriffe angezeigt wurden:Auf der GitHub-Seite des Projekts finden Sie eine ausführlichere Anleitung: https://github.com/ninjanye/SearchExtensions
Hoffe das hilft zukünftigen Besuchern
quelle
IQueryable
undIEnumerable
- seien Sie einfach weg, wenn Sie es an eine IEnumerable ketten, wird es im Speicher ausgeführt, anstatt eine Abfrage zu erstellen und an die Quelle zuLinq-Erweiterungsmethode. Funktioniert mit jedem IEnumerable-Objekt:
Verwendung:
quelle
Ich glaube, Sie könnten auch so etwas tun.
quelle
Nehme ich also richtig an, dass uid eine eindeutige Kennung (Guid) ist? Ist dies nur ein Beispiel für ein mögliches Szenario oder versuchen Sie wirklich, eine Anleitung zu finden, die einer Reihe von Zeichenfolgen entspricht?
Wenn dies zutrifft, möchten Sie vielleicht diesen ganzen Ansatz wirklich überdenken, scheint dies eine wirklich schlechte Idee zu sein. Sie sollten wahrscheinlich versuchen, eine Guid einer Guid zuzuordnen
Ich kann mir ehrlich gesagt kein Szenario vorstellen, in dem es eine gute Idee wäre, ein String-Array mit "enthält" an den Inhalt eines Guid anzupassen. Zum einen garantiert Contains () nicht die Reihenfolge der Nummern in den Guid, sodass Sie möglicherweise mit mehreren Elementen übereinstimmen können. Ganz zu schweigen davon, dass das Vergleichen von Guids auf diese Weise viel langsamer wäre, als es direkt zu tun.
quelle
Sie sollten es umgekehrt schreiben und überprüfen, ob Ihre privilegierte Benutzer-ID-Liste die ID in dieser Tabellenzeile enthält:
LINQ verhält sich hier recht hell und konvertiert es in eine gute SQL-Anweisung:
Hiermit wird der Inhalt des Arrays 'search' grundsätzlich in die SQL-Abfrage eingebettet und in SQL mit dem Schlüsselwort 'IN' gefiltert.
quelle
Ich habe es geschafft, eine Lösung zu finden, aber keine großartige, da AsEnumerable () verwendet werden muss, das alle Ergebnisse aus der Datenbank zurückgibt. Zum Glück habe ich nur 1k Datensätze in der Tabelle, so dass es nicht wirklich auffällt, aber hier geht es weiter .
Mein ursprünglicher Beitrag folgt:
quelle
Die beste Lösung, die ich gefunden habe, bestand darin, eine Tabellenwertfunktion in SQL zu erstellen, die die Ergebnisse liefert, z.
Anschließend ziehen Sie die Funktion einfach in Ihren LINQ.dbml-Designer und rufen sie wie Ihre anderen Objekte auf. Der LINQ kennt sogar die Spalten Ihrer gespeicherten Funktion. Ich nenne es so ::
Unglaublich einfach und nutzt die Leistung von SQL und LINQ in der Anwendung wirklich aus ... und Sie können natürlich jede gewünschte Tabellenwertfunktion für die gleichen Effekte generieren!
quelle
Ich glaube, was Sie wirklich tun möchten, ist: Stellen wir uns ein Szenario vor, in dem Sie zwei Datenbanken haben und diese eine gemeinsame Produkttabelle haben. Und Sie möchten Produkte aus der Tabelle "A" auswählen, die die ID mit dem "B" gemeinsam hat.
Die Verwendung der enthaltenen Methoden wäre zu kompliziert, um dies zu tun. Wir tun eine Kreuzung, und dafür gibt es eine Methode namens Kreuzung
Ein Beispiel aus msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
int [] Zahlen = (0, 2, 4, 5, 6, 8, 9); int [] numbersB = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);
Ich denke, was Sie brauchen, lässt sich leicht mit der Kreuzung lösen
quelle
Überprüfen Sie diese Erweiterungsmethode:
quelle
quelle
Versuchen:
quelle
quelle
quelle
quelle