Mam jedno ważne pytanie.
Otrzymałem zapytanie linq, które po prostu wygląda tak:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Wartości string[]
tablicy byłyby liczbami takimi jak (1,45,20,10 itd.)
wartość domyślna .Contains
to .Contains(string)
.
Muszę to zrobić zamiast tego: .Contains(string[])
...
EDYCJA: Jeden użytkownik zasugerował napisanie klasy rozszerzenia dla string[]
. Chciałbym się dowiedzieć, jak to zrobić, ale czy ktoś chce mi wskazać właściwy kierunek?
EDYCJA: UID byłby również liczbą. Dlatego jest konwertowany na ciąg.
Pomóż komuś?
Odpowiedzi:
spoulson ma go prawie w porządku, ale trzeba stworzyć
List<string>
odstring[]
początku. WłaściwieList<int>
byłoby lepiej, gdyby uid też byłint
.List<T>
obsługujeContains()
. Zrobienieuid.ToString().Contains(string[])
tego oznaczałoby, że uid jako łańcuch zawiera wszystkie wartości tablicy jako podłańcuch ??? Nawet jeśli napiszesz metodę rozszerzenia, jej znaczenie będzie nieprawidłowe.[EDYTOWAĆ]
Jeśli nie zmienisz tego i nie napisałeś,
string[]
jak pokazuje Mitch Wheat, możesz po prostu pominąć krok konwersji.[ENDEDIT]
Oto, czego chcesz, jeśli nie wykonasz metody rozszerzenia (chyba że masz już kolekcję potencjalnych uidów jako ints - po prostu użyj
List<int>()
zamiast tego). Używa to składni metody połączonej, która moim zdaniem jest czystsza, i dokonuje konwersji na int, aby upewnić się, że zapytanie może być używane z większą liczbą dostawców.źródło
List<int>
zamiast tego utworzył kolekcję w pamięci i pomińToString
wywołanie.Jeśli naprawdę chcesz powielić zawartość , ale w przypadku tablicy, oto metoda rozszerzenia i przykładowy kod do użycia:
źródło
!string.IsNullOrEmpty(str)
sprawdzenie przeszło pomyślnie, powodującvalues.Length > 0
zignorowanie warunku, ale długość wartości wynosiła 0 , to przeszedłby doforeach
i natychmiast przerwałby, ponieważ nie ma żadnych wpisów w tablicy, przechodzących bezpośrednio doreturn false
.Spróbuj wykonać następujące czynności.
źródło
LINQ w .NET 4.0 ma dla Ciebie inną opcję; metoda .Any ();
źródło
Any()
iAll()
metody są tak proste :) mogę używaćt => words.All(w => t.Title.Contains(w))
.Lub jeśli masz już dane na liście i wolisz inny format Linq :)
źródło
Co powiesz na:
źródło
To jest przykład jednego ze sposobów pisania metody rozszerzającej (uwaga: nie użyłbym tego do bardzo dużych tablic; inna struktura danych byłaby bardziej odpowiednia ...):
źródło
To późna odpowiedź, ale uważam, że jest nadal przydatna .
Utworzyłem pakiet nuget NinjaNye.SearchExtension , który może pomóc rozwiązać ten właśnie problem .:
Możesz również przeszukać wiele właściwości ciągu
Lub wykonaj polecenie
RankedSearch
które zwraca,IQueryable<IRanked<T>>
które po prostu zawiera właściwość pokazującą, ile razy pojawiły się wyszukiwane hasła:Istnieje obszerniejszy przewodnik na stronie projektów GitHub: https://github.com/ninjanye/SearchExtensions
Mam nadzieję, że pomoże to przyszłym odwiedzającym
źródło
IQueryable
iIEnumerable
- po prostu bądź z dala, jeśli połączysz go z IEnumerable, będzie działał w pamięci, zamiast budować zapytanie i wysyłać je do źródłaMetoda rozszerzenia Linq. Będzie działać z każdym obiektem IEnumerable:
Stosowanie:
źródło
Myślę, że możesz też zrobić coś takiego.
źródło
Czy więc poprawnie zakładam, że uid jest unikalnym identyfikatorem (Guid)? Czy to tylko przykład możliwego scenariusza, czy naprawdę próbujesz znaleźć guid, który pasuje do tablicy ciągów?
Jeśli to prawda, możesz naprawdę przemyśleć całe podejście, wydaje się to naprawdę złym pomysłem. Prawdopodobnie powinieneś próbować dopasować Guid do Guid
Szczerze mówiąc, nie wyobrażam sobie scenariusza, w którym dopasowanie tablicy ciągów przy użyciu „zawiera” do zawartości Guid byłoby dobrym pomysłem. Po pierwsze, Contains () nie gwarantuje kolejności liczb w Guid, więc możesz potencjalnie dopasować wiele elementów. Nie wspominając o tym, że porównywanie przewodników w ten sposób byłoby o wiele wolniejsze niż robienie tego bezpośrednio.
źródło
Powinieneś napisać to na odwrót, sprawdzając, czy lista identyfikatorów uprzywilejowanych użytkowników zawiera identyfikator w tym wierszu tabeli:
LINQ zachowuje się tutaj dość jasno i konwertuje to na dobrą instrukcję SQL:
który zasadniczo osadza zawartość tablicy „search” w kwerendzie sql i filtruje za pomocą słowa kluczowego „IN” w SQL.
źródło
Udało mi się znaleźć rozwiązanie, ale nie świetne, ponieważ wymaga użycia AsEnumerable (), który zwróci wszystkie wyniki z bazy danych, na szczęście mam tylko 1k rekordów w tabeli, więc nie jest to naprawdę zauważalne, ale tutaj idzie .
Mój oryginalny post jest następujący:
źródło
Najlepszym rozwiązaniem, jakie znalazłem, było utworzenie w języku SQL funkcji wartościowanej tabelą, która generuje wyniki, takie jak:
Następnie wystarczy przeciągnąć funkcję do projektanta LINQ.dbml i wywołać ją tak, jak inne obiekty. LINQ zna nawet kolumny twojej przechowywanej funkcji. Wołam to tak:
Niesamowicie proste i naprawdę wykorzystujące moc SQL i LINQ w aplikacji ... i oczywiście możesz wygenerować dowolną funkcję o wartości tabeli, którą chcesz, aby uzyskać te same efekty!
źródło
Uważam, że to, co naprawdę chcesz zrobić, to: wyobraźmy sobie scenariusz, w którym masz dwie bazy danych i mają one wspólną tabelę produktów I chcesz wybrać produkty z tabeli „A”, która ma wspólny identyfikator z „B”
użycie metody zawiera byłoby zbyt skomplikowane, aby to zrobić, to co robimy jest skrzyżowaniem i istnieje do tego metoda zwana przecięciem
przykład z msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
int [] liczby = (0, 2, 4, 5, 6, 8, 9); int [] liczbyB = (1, 3, 5, 7, 8); var = commonNumbers numbersA.Intersect (numbersB);
Myślę, że to, czego potrzebujesz, można łatwo rozwiązać za pomocą przecięcia
źródło
Sprawdź tę metodę rozszerzenia:
źródło
źródło
Próbować:
źródło
źródło
źródło
źródło
źródło