В любом случае я могу создать предложение не в том виде, которое я бы использовал в SQL Server в Linq для Entities?
Предложение "NOT IN" в LINQ to Entities
Ответ 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();