Синтаксис 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()
, но ни один из примеров не был достаточно близок.
Ответы
Ответ 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 МБ или более...