¿Hay alguna forma de que pueda crear una cláusula no en la que tendría en SQL Server en Linq para Entidades?cláusula "NOT IN" en LINQ to Entidades
Respuesta
Si está utilizando una colección en memoria como filtro, probablemente sea mejor usar la negación de Contiene(). Tenga en cuenta que esto puede fallar si la lista es demasiado larga, en cuyo caso tendrá que elegir otra estrategia (consulte a continuación el uso de una estrategia para una consulta totalmente orientada a BD).
var exceptionList = new List<string> { "exception1", "exception2" };
var query = myEntities.MyEntity
.Select(e => e.Name)
.Where(e => !exceptionList.Contains(e.Name));
Si está excluyendo basado en otra consulta de base de datos utilizando Except
podría ser una mejor elección. (Aquí es un link a las extensiones conjunto admitido en LINQ a Entidades)
var exceptionList = myEntities.MyOtherEntity
.Select(e => e.Name);
var query = myEntities.MyEntity
.Select(e => e.Name)
.Except(exceptionList);
Esto supone una entidad compleja en la que se está excluyendo a algunos que en función alguna propiedad de otra mesa y desea que los nombres de las entidades que no son excluido Si deseaba la entidad completa, tendría que construir las excepciones como instancias de la clase de entidad de modo que satisfaga el operador de igualdad predeterminado (consulte docs).
Probar:
from p in db.Products
where !theBadCategories.Contains(p.Category)
select p;
¿Qué es la consulta SQL que desea traducir en una consulta LINQ?
Tomé una lista y se utiliza,
!MyList.Contains(table.columb.tostring())
Nota: Asegúrese de utilizar la lista y no iList
tengo los siguientes métodos de extensión:
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;
}
Uso:
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));
Muy útil también cuando se pasa directamente valores:
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"));
Es útil, pero no se puede traducir a la expresión de la tienda. –
@MarekBar Siempre puede usar .AsEnumerable() antes del Where() .. – JoanComasFdz
Correcto, pero me gustaría ejecutar en la base de datos. AsEnumerable cargará datos en la memoria. –
he creado de una manera más similar a la de SQL, creo que es más fácil de entender
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();
- 1. Cláusula "Select NOT IN" en Linq para Entidades
- 2. Linq a Entidades Cláusula Distintiva
- 3. Nhibernate Linq In Cláusula
- 4. Donde cláusula IN en LINQ
- 5. Cláusula dynamic where en Linq para Entidades
- 6. LINQ to SQL MAX en WHERE cláusula
- 7. LINQ a Entidades - Un recorrido POR cláusula en consulta
- 8. Linq-to-entidades - Incluir método() no cargar
- 9. LINQ to SQL Donde Cláusula Criterio Opcional
- 10. Linq To Entities - cómo filtrar entidades hijo
- 11. IN y NOT IN con LINQ a Entidades (EF4.0)
- 12. Método de extensión en where cláusula en linq a Entidades
- 13. linq a entidades, a where where where cláusula? (interno donde)
- 14. "In" cláusula en anorm?
- 15. ¿Linq to sql carga automáticamente las entidades asociadas?
- 16. Entity Framework vs Linq to Entities vs Linq to SQL
- 17. LINQ to Entity, uniéndose a las tablas NOT IN
- 18. "where in" cláusula mysql
- 19. Ruby Activerecord IN cláusula
- 20. OracleParameter e IN Cláusula
- 21. Linq to Entities delete
- 22. Operador "IN" en Linq
- 23. Múltiple cláusula WHERE en Linq
- 24. Cláusula WHERE dinámica en LINQ
- 25. LINQ condicional cláusula Where
- 26. LINQ a Entidades EF4
- 27. Unir tablas que usan más de una columna en Linq To Entidades
- 28. LINQ To SQL Dynamic Select
- 29. LINQ - anidado donde cláusula
- 30. combinación interna en LINQ a las entidades
Por alguna razón 'Except' produce horribles SQL . 'Contains' es el método a usar aquí:' myEntities.MyEntity.Select (e => e.Name) .Where (x =>! ExceptionList.Contains (x)) '. –
@GertArnold, ¿podría por favor elaborar la declaración "produce SQL horrible"? Estoy usando Except, y está funcionando bien. Sin rarezas, ni peculiaridades de rendimiento, AFAIK. – NinjaCross
@NinjaCross Una instrucción como en la respuesta anterior produce SQL con n-1 cláusulas 'UNION ALL', donde n es el número de elementos en' exceptionList'. Lo intenté con EF 6.1, así que no es que haya mejorado o algo así. En EF 4.1 es lo mismo, así que no entiendo por qué esta respuesta ha sido aceptada alguna vez. La respuesta que propone 'Contiene' es la correcta. Creo que usaste 'Except' con otro' IQueryable' para que EF pueda traducirlo a SQL 'EXCEPT'. ¿Tuviste? –