[C#] Diferencia entre Select y SelectMany


Answers

Seleccionar muchos es como la operación de combinación cruzada en SQL donde toma el producto cruzado.
Por ejemplo, si tenemos

Set A={a,b,c}
Set B={x,y}

Seleccionar muchos se puede utilizar para obtener el siguiente conjunto

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

Tenga en cuenta que aquí tomamos todas las combinaciones posibles que se pueden hacer a partir de los elementos del conjunto A y el conjunto B.

Aquí hay un ejemplo de LINQ que puedes probar

  List<string> animals = new List<string>() { "cat", "dog", "donkey" };
  List<int> number = new List<int>() { 10, 20 };

  var mix=number.SelectMany(num => animals, (n, a) => new { n, a });

la mezcla tendrá los siguientes elementos en una estructura plana como

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}
Question

He estado buscando la diferencia entre Select y SelectMany pero no he podido encontrar una respuesta adecuada. Necesito aprender la diferencia cuando uso LINQ to SQL pero todo lo que he encontrado son ejemplos de matriz estándar.

¿Alguien puede proporcionar un ejemplo LINQ To SQL?




Entiendo que SelectMany funcione como un atajo de unión.

Así que puedes:

var orders = customers
             .Where(c => c.CustomerName == "Acme")
             .SelectMany(c => c.Orders);



Solo para una vista alternativa que pueda ayudar a algunos programadores funcionales:

  • Select es map
  • SelectMany es bind (o flatMap para su gente de Scala / Kotlin)



Algunos SelectMany pueden no ser necesarios. Debajo de 2 consultas dan el mismo resultado.

Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)

Orders.Where(o=>o.Customer.Name=="Tom")

Para la relación de 1 a muchos,

  1. si se comienza desde "1", se necesita SelectMany, se aplanan los muchos.
  2. si comienza desde "Muchos", SelectMany no es necesario. ( Todavía se puede filtrar desde "1" , también es más simple que la consulta de unión estándar por debajo)
from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o



SelectMany() permite colapsar una secuencia multidimensional de una manera que de otra manera requeriría un segundo Select() o loop.

Más detalles en esta publicación de blog .




Es la mejor manera de entender lo que pienso.

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

Ejemplo de Tabla de multiplicación.