Bonjour,
J'ai une liste d'objet et je voudrais savoir si la valeur d'un attribut existe dans une liste comme en SQL :
Comment faire simplement ?Code:SELECT * FROM table1 WHERE attribut IN (SELECT value FROM table2)
Merci d'avance
Version imprimable
Bonjour,
J'ai une liste d'objet et je voudrais savoir si la valeur d'un attribut existe dans une liste comme en SQL :
Comment faire simplement ?Code:SELECT * FROM table1 WHERE attribut IN (SELECT value FROM table2)
Merci d'avance
Le linq to sql nous facilite la tache pour utiliser l'objet, donc tu peux mettre:
var l1=from ...;//la 1ere requete
var l2=from ...;//la 2ere requete
A+ :ccool:Code:
1
2
3
4
5
6 foreach(.. in l1){ foreach(...in l2){ if(...==...) //tu ajoutes ces elements dans une liste } }
Ah oui mais non! Tu vas vite avoir des problèmes comme ca! Pour la simple et bonne raison que dans ce cas la, tu rappatries l'intégralité des deux tables! Ca va bien quand y'a 5-6 lignes mais après c'est ingérable!
Code:var result = context.Table1.Where(i1 => context.Table2.Select(i2.Attribut).Contains(i1.Attribut));
Me trompe-je ou c'est l'équivalent d'un join?
Ce qui en SQL revient à:Code:SELECT * FROM table1 WHERE attribut IN (SELECT value FROM table2)
Et en linq à:Code:
1
2SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.attribut = t2.value
Code:
1
2
3 var result = from t1 in table1 join t2 in table2 on t1.attribut equals t2.value select t1;
Pour répondre à chrisdot, oui IN est souvent l'équivalent d'un join mais y a pas de problème de cardinalité et de dédoublement de ligne. Avec linq je ne sais pas si ça change quelque chose. Mais en général j'utilise la méthode de Nathanael Marchand.
Je pense que cela sera plus performant.Code:
1
2 var result = context.Table1.Where(i1 => context.Table2.Any(i2=>I2.value==I1.Attribut));
=>Code:SELECT * FROM table1 WHERE attribut IN (SELECT value FROM table2)
Je pense que ceci devrait fonctionner.Code:List<table1> Result = Context.table1.Where( a => Context.table2.Any(b => a.attribut == b.value) == true).ToList();
N'est ce pas ce que je venais de proposer? :ccool:
Merci à vous tous;
J'ai opté pour la solution de iberserk :ccool: