2011-11-07 15 views
20

Próbowałem już tego szukać, ale nie znalazłem przykładów pasujących do mojej sytuacji.Linq IN Operator

Mam tę metodę dla klientów powracających. Jak mogę użyć tablicy łańcuchów znaków do filtrowania? Zawiera nie działa dla mnie.

public static List<Customer> GetCustomers(string[] customerCodesArray) 
{ 
    using (busDataContext g = new busDataContext()) 
    { 
     return g.Customers.Where(
      x => x.customerCode.Contains(customerCodesArray)).ToList(); 
    } 
} 
+1

Proszę wyjaśnić "co dokładnie" nie działa ... – Didaxis

+0

Co masz na myśli przez "nie działa"? Czy pojawia się błąd kompilacji? Jeśli tak, jaki jest błąd? Czy pojawia się błąd runtime? Jeśli tak, jaki jest błąd? –

+1

możliwy duplikat ["Where In" z linq do sql] (http://stackoverflow.com/questions/960827/where-in-with-linq-to-sql) – jrummell

Odpowiedz

31

Wypróbuj poniższy kod:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
+2

Chociaż technicznie poprawne, przy użyciu SQL nie jest to najlepsze rozwiązanie. Wymaga to zeskanowania całej tabeli Klientów i prawdopodobnie zewnętrznego zastosowania każdego rekordu w tablicy kodów klientów. Złożoność tego staje się O (N * M). Bardziej praktyczne byłoby użycie instrukcji sprzężenia Linq, więc wygenerowane zapytanie SQL może również używać sprzężenia. –

+0

@TonniTielens To całkowicie zależy od indeksów bazy danych. Niekoniecznie wygeneruje skan (a jeśli tak, połączenie również nie będzie lepsze). Z mojego doświadczenia wynika, że ​​wstawianie do tabeli tymczasowej i łączenie zapewnia korzyści tylko wtedy, gdy 'customerCodesArray' zawiera tysiące elementów. – Rob

20

Jesteś do tyłu:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
11

myślę, że trzeba odwrócić wyrażenia Contains ponieważ chcemy, aby zobaczyć, czy tablica zawiera kod klienta, nie na odwrót.

Spróbuj tego:

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
3

myślę, że to jest to, co chcesz

return g.Customers.Where(x => customerCodesArray.Contains(x.customerCode)).ToList(); 
5

Spróbuj

return g.Customers.Where(x=>customerCodesArray.Contains(x.CustomerCode)).ToList();