2011-08-24 8 views
24

Mam prosty problem ze składnią Entity Framework dla "nie w" równoważniku SQL. Zasadniczo, chcę przekonwertować następującej składni SQL do składni Entity Framework:Składnia SQL "nie w" dla Entity Framework 4.1

select ID 
from dbo.List 
where ID not in (list of IDs) 

Oto metoda, która używam do przeszukiwania pojedynczy rekord:

public static List GetLists(int id) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(m => m.ID == id); 
    } 
} 

Tutaj jest pseudo-metoda Chcę użyć tego:

public static List<List> GetLists(List<int> listIDs) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(**** What Goes Here ****).ToList(); 
    } 
} 

Może ktoś mi dać wskazówki co do tego, co dzieje się w obszarze Where klauzula? Przeczytałem kilka forów o tym i widziałem wzmiankę o używaniu .Contains() lub .Any(), ale żaden z przykładów nie był wystarczająco dobrze dopasowany.

+1

+1 Bardzo ładne, dobrze sformułowane pytanie za bycie pierwszym zapytano tutaj o Stack Overflow. Witamy. – ckittel

Odpowiedz

49

dać to go ...

public static List<List> GetLists(List<int> listIDs) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     // Use this one to return List where IS NOT IN the provided listIDs 
     return db.Lists.Where(x => !listIDs.Contains(x.ID)).ToList(); 

     // Or use this one to return List where IS IN the provided listIDs 
     return db.Lists.Where(x => listIDs.Contains(x.ID)).ToList(); 
    } 
} 

nich zamieni się w następujących przybliżonych zapytań do bazy danych:

SELECT [Extent1].* 
FROM [dbo].[List] AS [Extent1] 
WHERE NOT ([Extent1].[ID] IN (<your,list,of,ids>)) 

lub

SELECT [Extent1].* 
FROM [dbo].[List] AS [Extent1] 
WHERE [Extent1].[ID] IN (<your,list,of,ids>) 

odpowiednio.

+0

To jest idealne - działało bez czkawki! Dzięki za przykłady. –

+2

Bardzo zwięzłe wyjaśnienie tutaj. – BentOnCoding

2

Spróbuj na początek ...

m => !listIDs.Contains(m.ID) 
3

To jeden wymaga, aby myśleć wstecz trochę. Zamiast pytać, czy wartość nie znajduje się na jakiejś liście identyfikatorów, musisz poprosić o listę identyfikatorów, która nie zawiera wartości. Podoba Ci się to

int[] list = new int[] {1,2,3} 
Result = (from x in dbo.List where list.Contains(x.id) == false select x); 
0

Może to być sposób na to, co chcesz:

// From the method you provided, with changes... 
public static List GetLists(int[] ids) // Could be List<int> or other =) 
{ 
    using (dbInstance db = new dbInstance()) 
    { 
     return db.Lists.Where(m => !ids.Contains(m.ID)); 
    } 
} 

jednak odkryłem, że ten sposób może wywołać błąd w niektórych sytuacjach, szczególnie wtedy, gdy lista jest zbyt duże i połączenie jest nieco powolny.

Pamiętaj, aby sprawdzić wszystko inne, PRZED więc ten filtr może mieć mniej wartości do sprawdzenia.

Pamiętaj również, że Linq nie wypełnia zmiennej podczas budowania filtra/zapytania (przynajmniej domyślnie). Jeśli zamierzasz powtarzać dla każdego rekordu, pamiętaj, aby wcześniej wywołać metodę ToList() lub ToArray(), chyba że każdy rekord ma 500 MB lub więcej ...

Powiązane problemy