2013-03-02 12 views
5

Mam problem z ustaleniem, jak wykonać zapytanie do bazy danych za pomocą linq wC#, aby uzyskać wszystkie obiekty odpowiadające liście lub tablicy identyfikatorów i umieścić je na liście. Na przykład:Zapytanie Linqa przy użyciu listy lub tablicy identyfikatorów

Mam tabelę przedmiotów. Chcę zbudować metodę, która pobiera wszystkie elementy, których identyfikatory znajdują się w tablicy przebiegów lub listach. Mam googleed to, ale zawsze zakłada, że ​​chcę tylko kwerendy przeciwko listy lub tablicy zamiast kwerendy Z listy lub tablicy.

Z góry dziękuję.

Odpowiedz

19

Brzmi jak chcesz coś takiego:

var query = items.Where(item => validIds.Contains(item.Id)); 

pamiętać, że jeśli to wszystko lokalnego (tj procesu, LINQ to Objects), a może masz wiele ważnych identyfikatorów, prawdopodobnie chcesz, aby skonstruować a HashSet<T>.

Albo można zrobić dołączyć, oczywiście:

var query = from id in validIds 
      join item in items on id equals item.Id 
      select item; 

(Nie wiele tego przykładów w internecie, a nawet na przepełnienie stosu, ale mogę zrozumieć, że to nie jest łatwe znaleźć jak wszystkich kategoriach chcesz korzystać, są powszechne.)

+0

wygląda, że ​​będzie pracować dla moich potrzeb. Wypróbuję to. Dzięki! –

+0

Niestety staje się to problematyczne, gdy masz dużo identyfikatorów. Otrzymasz błąd w wierszach 'Żądanie przychodzące ma zbyt wiele parametrów. Serwer obsługuje maksymalnie 2100 parametrów, ponieważ zawiera nie buduje zapytania za pomocą 'SELECT * FROM TABLE WHERE ID IN (x, y .... z)', ale zamiast tego wstawia wiele parametrów. – ppumkin

+1

@ppumkin: Rzeczywiście, to w końcu jest problemem - i szczerze mówiąc, nie wiem, jaki jest wspierany przez EF sposób radzenia sobie z tą sytuacją. –

0

Zastosowanie jak ten

var subscriptionDetails = SubscriptionMasterBL.GetSubscriptionMasterDetails(); 
       tempUserList = lstSubscriberUsers.Where(a => subscriptionDetails.Any(b => b.SubscriptionUserId == a.Id 
        && b.TokenId != Guid.Empty)).ToList(); 
+0

To nie wydaje się działać z lokalnym zbiorem identyfikatorów ... z jakiegoś powodu. Mimo że czytałem gdzieś, powinniśmy użyć 'Any()' jako znacznie szybszego niż 'Contains()' .. ale nie zdawałem sobie sprawy, że możesz zastosować to do zapytań SQL .. w jakiś sposób dostaję błąd 'Lokalna sekwencja nie może być używane w LINQ do implementacji SQL operatorów zapytań z wyjątkiem operatora Zawiera. " – ppumkin

Powiązane problemy