Est-il possible de créer une clause not in comme dans SQL Server dans Linq to Entities?Clause "NOT IN" dans LINQ to Entities
Répondre
Si vous utilisez une collection en mémoire comme filtre, il est probablement préférable d'utiliser la négation de Contains(). Notez que cela peut échouer si la liste est trop longue, auquel cas vous devrez choisir une autre stratégie (voir ci-dessous pour l'utilisation d'une stratégie pour une requête entièrement orientée DB).
var exceptionList = new List<string> { "exception1", "exception2" };
var query = myEntities.MyEntity
.Select(e => e.Name)
.Where(e => !exceptionList.Contains(e.Name));
Si vous excluez basé sur une autre requête de base de données en utilisant Except
pourrait être un meilleur choix. (Voici un link aux extensions Set pris en charge dans LINQ to Entities)
var exceptionList = myEntities.MyOtherEntity
.Select(e => e.Name);
var query = myEntities.MyEntity
.Select(e => e.Name)
.Except(exceptionList);
Cela suppose une entité complexe dans lequel vous excluez certains d'entre eux selon une propriété d'une autre table et que vous voulez les noms des entités qui ne sont pas exclu. Si vous vouliez l'entité entière, vous devez alors construire les exceptions en tant qu'instances de la classe d'entité de sorte qu'elles satisfassent l'opérateur d'égalité par défaut (voir docs).
Essayez:
from p in db.Products
where !theBadCategories.Contains(p.Category)
select p;
Quelle est la requête SQL que vous souhaitez traduire dans une requête Linq?
Je pris une liste et utilisé,
!MyList.Contains(table.columb.tostring())
Remarque: Assurez-vous d'utiliser la liste et non iList
je les méthodes d'extension suivantes:
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;
}
Utilisation:
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));
Très utile aussi bien lors du passage des valeurs directement:
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"));
Il est utile, mais il ne peut pas être traduit en expression magasin. –
@MarekBar Vous pouvez toujours utiliser .AsEnumerable() avant le Where() .. – JoanComasFdz
C'est vrai, mais je voudrais exécuter dans la base de données. AsEnumerable chargera les données dans la mémoire. –
Je l'ai créé d'une manière plus similaire à SQL, je pense qu'il est plus facile de comprendre
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. LINQ to Entities
- 2. LINQ to Entities
- 3. Linq to Entities System.data.Objects
- 4. dates distinctes dans LINQ To Entities?
- 5. Linq to Entities - Eager Chargement
- 6. OnValidate() et LINQ to Entities
- 7. LINQ to Entities requêtes Oddity
- 8. LINQ to Nhiberate - clause Where
- 9. Optimize Grouper par dans LINQ to Entities
- 10. Jointure externe gauche dans Linq-To-Entities
- 11. LINQ-to-SQL IN()
- 12. LINQ to Entities et Xml Les champs
- 13. Linq to Entities et propriétés concaténées
- 14. LINQ to Entities: Les expressions lambda
- 15. Problème avec LINQ to Entities et String.StartsWith
- 16. Ajout à la clause Where d'une mise à jour dans LinQ-to-Entities
- 17. Comment utiliser flags enums dans les requêtes Linq to Entities?
- 18. Désireuse chargement et LINQ to Entities
- 19. LINQ to Entities pour soustraire 2 dates
- 20. Dois-je considérer LINQ to Entities?
- 21. Linq To Entities Générer de grandes requêtes
- 22. Linq to Entities Filtrage d'une entité dynamique/fortement typée
- 23. Linq to Entities jointures excessives dans le code SQL généré
- 24. LINQ to SQL - types nullables dans la clause where
- 25. C# Clause WHERE dynamique dans une requête LINQ to SQL
- 26. LINQ to Entities: Utilisation de DateTime.AddMonth dans l'expression Lambda
- 27. LINQ to Entities: requête avec quatre tables REJOIGNEZ
- 28. clause where dans LINQ to SQL fonction Sum()
- 29. Linq à Entities-- Havine un Guid dans la clause where jette erreur
- 30. Linq to Entities requête frappant deux fois db
Pour une raison quelconque 'Except' produit horribles SQL . 'Contains' est la méthode à utiliser ici:' myEntities.MyEntity.Select (e => e.Name) .Where (x =>! ExceptionList.Contains (x)) '. –
@GertArnold, pourriez-vous s'il vous plaît élaborer la déclaration "produit horrible SQL"? J'utilise Except, et ça marche très bien. Pas de bizarreries, ni de défauts de performance, AFAIK. – NinjaCross
@NinjaCross Une instruction comme dans la réponse ci-dessus produit SQL avec n-1 clauses UNION ALL, où n est le nombre d'éléments dans 'exceptionList'. Je viens d'essayer avec EF 6.1, donc ce n'est pas que ça s'est amélioré ou quelque chose comme ça. Dans EF 4.1 c'est la même chose, donc je ne comprends tout simplement pas pourquoi cette réponse a été acceptée. La réponse proposant «Contient» est la bonne. Je pense que vous avez utilisé 'Except' avec un autre' IQueryable', donc EF a pu le traduire en SQL 'EXCEPT'. As tu? –