2010-10-23 25 views
34

Quiero fusionar los registros de dos listas IQueryable en C#. TratoCómo fusionar dos listas IQueryable

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

y

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

pero si list1 está vacío, la lista resultante también está vacía. En mi caso, list1 puede estar vacío, pero list2 puede tener registros. ¿Cómo debo unirlos?

Respuesta

52

no se está usando el valor de retorno - al igual que todos los demás operadores LINQ, el método no cambia la secuencia existente - devuelve una secuencia nueva. Así que trate de esto:

var list3 = list1.Concat(list2); 

o

var list4 = list1.Union(list2); 

Union es una operación de conjunto - que devuelve valores distintos.

Concat simplemente devuelve los elementos de la primera secuencia seguidos por los elementos de la segunda secuencia; la secuencia resultante puede incluir elementos duplicados.

Puede pensar en Union como Concat seguido de Distinct.

+0

¿Se pueden pedir los elementos en un IQuerable? En caso afirmativo, haga estos dos estadistas ts preservar el orden de la misma manera? – CowboyBebop

+1

@CowboyBebop: * Se pueden * ordenar * - 'IQuedQueryable' extiende' IQueryable', por ejemplo. En LINQ to Objects, el orden se conserva con estas operaciones, pero dudo que esté garantizado para proveedores de consultas fuera de proceso. –

+0

Interesante es que aún puede encadenar la consulta usando Union, por lo que no se ejecutará y el resultado sería un 'IQueryable ' que me ayudó mucho en mi caso. – Niklas

1

Incluso

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

no funciona?

Y asegúrese de que las listas están vacías, no nulo:

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

Proveedores:

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

No tengo intentar ambos :( –

+0

@Fraz: Pruebe cada una de mi variante e informe los resultados – abatishchev

-2

Otra opción que encontré:
declaran:
IEnumerable<int> usersIds = new int[0];
Por ejemplo dentro de un bucle:

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

Ahora usersIds y ids (a diferencia) contiene el ID de todos los usuarios -int- como IEnumerable