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?
c#
linq-to-sql
linq
Tarik
fuente
fuente
Respuestas:
SelectMany
aplana las consultas que devuelven listas de listas. Por ejemploDemostración en vivo en .NET Fiddle
fuente
Seleccionar muchos es como una operación de unión cruzada en SQL donde toma el producto cruzado.
Por ejemplo si tenemos
Seleccionar muchos se puede utilizar para obtener el siguiente conjunto
Tenga en cuenta que aquí tomamos todas las combinaciones posibles que se pueden hacer de los elementos del conjunto A y el conjunto B.
Aquí hay un ejemplo de LINQ que puedes probar
la mezcla tendrá los siguientes elementos en estructura plana como
fuente
SelectMany
es . Más bien, esta es una forma queSelectMany
se puede usar, pero en realidad no es la forma normal de usarlo.Where
condición después de SelectMany...
fuente
SelectMany()
le permite contraer una secuencia multidimensional de una manera que de otro modo requeriría un segundoSelect()
o bucle.Más detalles en esta publicación de blog .
fuente
Hay varias sobrecargas a
SelectMany
. Uno de ellos le permite realizar un seguimiento de cualquier relación entre padres e hijos mientras recorre la jerarquía.Ejemplo : supongamos que tiene la siguiente estructura:
League -> Teams -> Player
.Puede devolver fácilmente una colección plana de jugadores. Sin embargo, puede perder cualquier referencia al equipo del que forma parte el jugador.
Afortunadamente hay una sobrecarga para tal fin:
El ejemplo anterior está tomado del blog Dan's IK . Le recomiendo que lo eche un vistazo.
fuente
Entiendo
SelectMany
trabajar como un atajo de combinación.Así que puedes:
fuente
.SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate});
no funcionaría. SelectMany está más bien allanando la lista de listas, y puede elegir cualquiera (pero solo una a la vez) de las listas contenidas para el resultado. A modo de comparación: unirse internamente en Linq .Seleccionar es una simple proyección uno a uno del elemento fuente a un elemento resultado. Select- Many se usa cuando hay múltiples cláusulas from en una expresión de consulta: cada elemento de la secuencia original se usa para generar una nueva secuencia.
fuente
Algunos SelectMany pueden no ser necesarios. Por debajo de 2 consultas dan el mismo resultado.
Para una relación de 1 a muchos,
fuente
Sin ser demasiado técnico: base de datos con muchas organizaciones, cada una con muchos usuarios:
ambos devuelven la misma lista de ApplicationUser para la Organización seleccionada.
Los primeros "proyectos" de Organización a Usuarios, el segundo consulta la tabla Usuarios directamente.
fuente
Está más claro cuando la consulta devuelve una cadena (una matriz de caracteres):
Por ejemplo, si la lista 'Frutas' contiene 'manzana'
'Seleccionar' devuelve la cadena:
'SelectMany' aplana la cadena:
fuente
Solo para una vista alternativa que pueda ayudar a algunos programadores funcionales:
Select
esmap
SelectMany
esbind
(oflatMap
para su gente Scala / Kotlin)fuente
Considere este ejemplo:
Entonces, como ve, los valores duplicados como "I" o "me gusta" se han eliminado de query2 porque "SelectMany" se aplana y proyecta en varias secuencias. Pero query1 devuelve la secuencia de matrices de cadenas. y dado que hay dos matrices diferentes en query1 (primer y segundo elemento), no se eliminaría nada.
fuente
Un ejemplo más de cómo se puede utilizar SelectMany + Select para acumular datos de objetos de submatriz.
Supongamos que tenemos usuarios con sus teléfonos:
Ahora necesitamos seleccionar las BaseParts de todos los teléfonos de todos los usuarios:
fuente
usersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))
Aquí hay un ejemplo de código con una pequeña colección inicializada para probar:
fuente
El
SelectMany
método derribaIEnumerable<IEnumerable<T>>
a unIEnumerable<T>
, como el comunismo, cada elemento se comporta de la misma manera (un tipo estúpido tiene los mismos derechos que uno genio).fuente
Es la mejor manera de entender, creo.
Ejemplo de tabla de multiplicar.
fuente