Подтвердить что ты не робот

Синтаксис SQL "не в" для Entity Framework 4.1

У меня есть простая проблема с синтаксисом Entity Framework для "не в" эквиваленте SQL. По сути, я хочу преобразовать следующий синтаксис SQL в синтаксис Entity Framework:

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

Вот метод, который я использую для поиска одной записи:

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

Вот псевдо-метод, который я хочу использовать для этого:

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

Может ли кто-нибудь дать мне указания относительно того, что входит в область Where? Я прочитал некоторые форумы об этом и увидел упоминание об использовании .Contains() или .Any(), но ни один из примеров не был достаточно близок.

4b9b3361

Ответ 1

Отдайте это...

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();
    }
}

Они превратятся в примерно следующие запросы к базе данных:

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

или

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

соответственно.

Ответ 2

Это требует от вас немного подумать. Вместо того, чтобы спрашивать, не указано ли значение в каком-либо списке идентификаторов, вы должны спросить, какой список идентификаторов не содержит значения. Как этот

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

Ответ 3

Попробуйте это для начинающих...

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

Ответ 4

Это может быть способ сделать то, что вы хотите:

// 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));
    }
}

Однако я обнаружил, что это может привести к ошибке в некоторых сценариях, особенно когда список слишком большой, а соединение несколько медленнее.

Не забудьте проверить все остальное до того, как этот фильтр может иметь меньше значений для проверки.

Также помните, что Linq не заполняет эту переменную при создании фильтра/запроса (по крайней мере, не по умолчанию). Если вы собираетесь выполнять итерацию для каждой записи, не забудьте сначала вызвать метод ToList() или ToArray(), если каждая запись не имеет 500 МБ или более...