Предложение «НЕ В» в LINQ to Entities - PullRequest
45 голосов
/ 11 января 2009

Можно ли в любом случае создать предложение not in, как в SQL Server в Linq to Entities ?

Ответы [ 5 ]

90 голосов
/ 11 января 2009

Если вы используете коллекцию в памяти в качестве фильтра, вероятно, лучше использовать отрицание Contains (). Обратите внимание, что это может не сработать, если список слишком длинный, и в этом случае вам нужно будет выбрать другую стратегию (см. Ниже информацию об использовании стратегии для полностью ориентированного на DB запроса).

   var exceptionList = new List<string> { "exception1", "exception2" };

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Where(e => !exceptionList.Contains(e.Name));

Если вы исключаете данные из другого запроса к базе данных, лучше использовать Except. (Вот ссылка на поддерживаемые расширения набора в LINQ to Entities)

   var exceptionList = myEntities.MyOtherEntity
                                 .Select(e => e.Name);

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Except(exceptionList);

Это предполагает сложную сущность, в которой вы исключаете определенные, зависящие от какого-либо свойства другой таблицы, и хотите, чтобы имена сущностей не были исключены. Если вам нужна вся сущность, вам нужно будет создать исключения как экземпляры класса сущности так, чтобы они удовлетворяли оператору равенства по умолчанию (см. docs ).

14 голосов
/ 11 января 2009

Попробуйте:

from p in db.Products
where !theBadCategories.Contains(p.Category)
select p;

Какой запрос SQL вы хотите перевести в запрос Linq?

6 голосов
/ 02 марта 2016

У меня есть следующие методы расширения:

    public static bool IsIn<T>(this T keyObject, params T[] collection)
    {
        return collection.Contains(keyObject);
    }

    public static bool IsIn<T>(this T keyObject, IEnumerable<T> collection)
    {
        return collection.Contains(keyObject);
    }

    public static bool IsNotIn<T>(this T keyObject, params T[] collection)
    {
        return keyObject.IsIn(collection) == false;
    }

    public static bool IsNotIn<T>(this T keyObject, IEnumerable<T> collection)
    {
        return keyObject.IsIn(collection) == false;
    }

Использование:

var inclusionList = new List<string> { "inclusion1", "inclusion2" };
var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsIn(inclusionList));

var exceptionList = new List<string> { "exception1", "exception2" };
var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsNotIn(exceptionList));

Также очень полезно при передаче значений напрямую:

var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsIn("inclusion1", "inclusion2"));

var query = myEntities.MyEntity
                     .Select(e => e.Name)
                     .Where(e => e.IsNotIn("exception1", "exception2"));
4 голосов
/ 08 сентября 2011

Я взял список и использовал,

!MyList.Contains(table.columb.tostring())

Примечание. Обязательно используйте список, а не список

0 голосов
/ 21 ноября 2016

Я создал его более похожим на SQL, я думаю, что это легче понять

var list = (from a in listA.AsEnumerable()
            join b in listB.AsEnumerable() on a.id equals b.id into ab
            from c in ab.DefaultIfEmpty()
            where c != null
            select new { id = c.id, name = c.nome }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...