2010-10-23 5 views
34

Je souhaite fusionner les enregistrements de deux listes IQueryable en C#. J'essaieComment fusionner deux listes IQueryable

IQueryable<MediaType> list1 = values; 
IQueryable<MediaType> list2 = values1; 
obj.Concat(obj1); 

et

IQueryable<MediaType> list1 = values; 
IQueryable<MediaType> list2 = values1; 
obj.Union(obj1); 

mais si list1 est vide alors la liste résultante est également vide. Dans mon cas, list1 peut être vide mais list2 peut avoir des enregistrements. Comment devrais-je les fusionner?

Répondre

52

Vous n'êtes pas en utilisant la valeur de retour - comme tous les autres opérateurs LINQ, la méthode ne change pas la séquence existante - elle renvoie une nouvelle séquence . Donc, essayez ceci:

var list3 = list1.Concat(list2); 

ou

var list4 = list1.Union(list2); 

Union est une opération de jeu - il renvoie des valeurs distinctes.

Concat retourne simplement les éléments de la première séquence suivie par les éléments de la deuxième séquence; la séquence résultante peut inclure des éléments en double. Vous pouvez penser à Union comme Concat suivi de Distinct.

+0

Peut les éléments dans un IQuerable être commandé? Si oui, faire ces deux déclarations ts préserver l'ordre de la même manière? – CowboyBebop

+1

@CowboyBebop: Ils * peuvent * être commandés - 'IOrderedQueryable' étend' IQueryable', par exemple. Dans LINQ to Objects, l'ordre est préservé avec ces opérations - mais je doute qu'il soit garanti pour les fournisseurs de requêtes hors processus. –

+0

La partie intéressante est que vous pouvez toujours enchaîner la requête en utilisant Union, donc il ne sera pas exécuté et le résultat sera toujours un 'IQueryable ' qui m'a aidé beaucoup dans mon cas. – Niklas

1

Même

var result = Enumerable.Concat(list1, list2); 

ne fonctionne pas?

Et assurez-vous que les listes sont vides, non null:

var result = Enumerable.Concat(
    list1 ?? Enumerable.Empty<MediaType>() 
    list2 ?? Enumerable.Empty<MediaType>()); 

Grossistes:

var result = Enumerable.Concat(
    list1.AsEnumerable(), 
    list2.AsEnumerable()); 
+0

Non, j'ai essayé les deux :( –

+0

@Fraz: S'il vous plaît essayer chacune de ma variante et de signaler les résultats – abatishchev

-2

Une autre option que j'ai trouvé:
Declare:
IEnumerable<int> usersIds = new int[0];
Par exemple dans une boucle:

foreach (var id in Ids) { 
      IQueryable<int> _usersIds = bl.GetUsers(id).Select(x => x.UserID); 
      usersIds = usersIds.Concat(_usersIds); 
     } 
var ids = usersIds.Distinct(); 

maintenant usersIds et ids (distinctes) contient l'identifiant de tous les utilisateurs comme IEnumerable -int-