c# - Diferencia entre Select y SelectMany




6 Answers

Seleccionar muchos es como una operación de unió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 estructura plana como

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}
c# linq-to-sql linq

He estado buscando la diferencia entre Select y SelectMany pero no he podido encontrar una respuesta adecuada. Necesito aprender la diferencia al usar LINQ To SQL, pero todo lo que he encontrado son ejemplos de matrices estándar.

¿Puede alguien proporcionar un ejemplo de LINQ To SQL?




SelectMany() permite contraer una secuencia multidimensional de una manera que de otro modo requeriría un segundo Select() o un bucle.

Más detalles en esta entrada de blog .




Entiendo que SelectMany funciona como un acceso directo de combinación.

Así que puedes:

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



Algunos SelectMany pueden no ser necesarios. A continuación 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 1-to-Many,

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



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

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



Un ejemplo más de cómo se puede utilizar SelectMany + Select para acumular datos de objetos de sub array.

Supongamos que tenemos usuarios con sus teléfonos:

class Phone { 
    public string BasePart = "555-xxx-xxx"; 
}

class User { 
    public string Name = "Xxxxx";
    public List<Phone> Phones; 
}

Ahora debemos seleccionar la base de todos los teléfonos de todos los usuarios:

var usersArray = new List<User>(); // array of arrays
List<string> allBaseParts = usersArray.SelectMany(ua => ua.Phones).Select(p => p.BasePart).ToList();



Related