Comment puis-je combiner plusieurs requêtes linq dans un jeu de résultats?
J'ai un multi-sélectionner la case à cocher. En fonction de celui qui est vérifié, je tiens à combiner les résultats en une seule requête. Un peu comme:
if (Checkbox1.Checked)
{
var query1 = from t in table1 ...
}
if (Checkbox2.Checked)
{
var query2 = from t in table2 ...
}
DataGridView1.DataSource = query1.Union(query2); //obviously doesnt
//work since query1 and query2 are not defined in this scope.
Aucune idée de la façon de les combiner de manière sélective?
OriginalL'auteur esac | 2010-07-01
Vous devez vous connecter pour publier un commentaire.
En supposant que les requêtes sont du même type, vous pouvez définir les requêtes à l'extérieur des instructions conditionnelles.
Tout d'abord, une méthode d'assistance qui crée un vide énumérable du même type que le paramètre:
Ensuite, le nouveau code:
Effectue amende juste parce que les requêtes ne sont pas réellement exécutée jusqu'à ce qu'ils sont énumérés plus, comme dans l'appel à
ToList()
.Ben M - je me souviens que maintenant, mais je ne peux toujours pas le faire "var finalQuery = null;"
Je suis en fondant ma réponse sur la prémisse que votre requête énumère plus d'un type anonyme. Si pas, vous pouvez simplement remplacer
var
avecIEnumerable<QueryType>
.oui, c'est à partir d'un type anonyme. Votre exemple est proche, mais encore une question. Dans la seconde case, si finalQuery est nul, vous ne pouvez pas appeler finalQuery.De l'Union(query2), si vous avez besoin d'une instruction if.
L'homme. Ça m'apprendra à faire deux choses à la fois. J'ai ajouté une fonction d'assistance qui rend les choses beaucoup plus propre -- elle renvoie un vide énumération du type (dans ce cas anonymes) de la requête spécifiée. Donc, plus la valeur null contrôles.
OriginalL'auteur Ben M
Si vous n'utilisez pas de var mais un type connu, alors vous pouvez initialiser requête1 et query2 via
Enumerable.Empty<T>
dans le cas de la case à cocher ne pas être cochée.OriginalL'auteur Frank
J'ai juste essayé ce dans une application console, comme je l'ai été curieux, et il a travaillé....
Cependant, si je change le fieldnames dans l'anonymat de types différents j'obtiens une erreur du compilateur, donc il semble que la clé est d'avoir les noms de même dans votre types anonymes. Ou tout simplement avoir le résultat dans un type défini 🙂
Ouais, je sais déjà que l'Union fonctionne. Le problème est que mon des types anonymes ont été déclarées dans le if, qui fait en sorte que vous ne pouvez pas faire de l'Union à l'extérieur de l'if.
si les anonymes, les types sont les mêmes, pourquoi ne pas simplement faire une classe privée et de l'utiliser?
OriginalL'auteur Antony Scott
À l'aide de Rx vous pouvez faire quelque chose comme ceci:
OriginalL'auteur Richard Hein