Предложение "NOT IN" в LINQ to Entities - программирование
Подтвердить что ты не робот

Предложение "NOT IN" в LINQ to Entities

В любом случае я могу создать предложение не в том виде, которое я бы использовал в SQL Server в Linq для Entities?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Try:

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

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

Ответ 3

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

    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

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

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

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

Ответ 5

Я создал его более похожим образом на 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();