J'ai cherché la différence entre Select
et SelectMany
mais je n'ai pas pu trouver de réponse appropriée. J'ai besoin d'apprendre la différence lors de l'utilisation de LINQ To SQL, mais tout ce que j'ai trouvé sont des exemples de tableaux standard.
Quelqu'un peut-il fournir un exemple LINQ To SQL?
c#
linq-to-sql
linq
Tarik
la source
la source
Réponses:
SelectMany
aplatit les requêtes qui renvoient des listes de listes. Par exempleDémo en direct sur .NET Fiddle
la source
Sélectionner plusieurs, c'est comme une opération de jointure croisée dans SQL où il prend le produit croisé.
Par exemple, si nous avons
Sélectionnez plusieurs peuvent être utilisés pour obtenir l'ensemble suivant
Notez que nous prenons ici toutes les combinaisons possibles qui peuvent être faites à partir des éléments de l'ensemble A et de l'ensemble B.
Voici un exemple LINQ que vous pouvez essayer
le mélange aura les éléments suivants dans une structure plate comme
la source
SelectMany
est . C'est plutôt un moyen quiSelectMany
peut être utilisé, mais ce n'est pas vraiment la façon normale de l'utiliser.Where
condition après SelectMany...
la source
SelectMany()
vous permet de réduire une séquence multidimensionnelle d'une manière qui nécessiterait autrement une secondeSelect()
ou une boucle.Plus de détails sur ce billet de blog .
la source
Il y a plusieurs surcharges
SelectMany
. L'un d'eux vous permet de garder trace de toute relation entre le parent et les enfants tout en parcourant la hiérarchie.Exemple : supposons que vous avez la structure suivante:
League -> Teams -> Player
.Vous pouvez facilement retourner une collection plate de joueurs. Cependant, vous risquez de perdre toute référence à l'équipe dont le joueur fait partie.
Heureusement, il existe une surcharge à cette fin:
L'exemple précédent est tiré du blog IK de Dan . Je vous recommande fortement d'y jeter un œil.
la source
Je comprends que je
SelectMany
travaille comme un raccourci de jointure.Afin que vous puissiez:
la source
.SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate});
ne fonctionnerait pas. SelectMany aplatit plutôt la liste des listes - et vous pouvez choisir n'importe laquelle (mais une seule à la fois) des listes contenues pour le résultat. A titre de comparaison: jointure interne à Linq .Select est une simple projection biunivoque de l'élément source vers un élément résultat. Select- Many est utilisé lorsqu'il existe plusieurs clauses from dans une expression de requête: chaque élément de la séquence d'origine est utilisé pour générer une nouvelle séquence.
la source
Certains SelectMany peuvent ne pas être nécessaires. En dessous de 2 requêtes donnent le même résultat.
Pour une relation 1 à plusieurs,
la source
Sans devenir trop technique - base de données avec de nombreuses organisations, chacune avec de nombreux utilisateurs: -
les deux renvoient la même liste ApplicationUser pour l'organisation sélectionnée.
Le premier "projets" de l'organisation aux utilisateurs, le second interroge directement la table des utilisateurs.
la source
Il est plus clair lorsque la requête renvoie une chaîne (un tableau de caractères):
Par exemple, si la liste «Fruits» contient «pomme»
'Select' renvoie la chaîne:
'SelectMany' aplatit la chaîne:
la source
Juste pour une autre vue qui peut aider certains programmeurs fonctionnels:
Select
estmap
SelectMany
estbind
(ouflatMap
pour votre peuple Scala / Kotlin)la source
Considérez cet exemple:
Ainsi, comme vous voyez des valeurs en double comme "I" ou "j'aime" ont été supprimées de query2 parce que "SelectMany" s'aplatit et se projette sur plusieurs séquences. Mais query1 renvoie une séquence de tableaux de chaînes. et comme il y a deux tableaux différents dans query1 (premier et deuxième élément), rien ne serait supprimé.
la source
Un autre exemple de la façon dont SelectMany + Select peut être utilisé afin d'accumuler des données d'objets de sous-tableau.
Supposons que nous ayons des utilisateurs avec leurs téléphones:
Maintenant, nous devons sélectionner les BaseParts de tous les téléphones de tous les utilisateurs:
la source
usersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))
Voici un exemple de code avec une petite collection initialisée pour les tests:
la source
La
SelectMany
méthode fait tomber unIEnumerable<IEnumerable<T>>
dansIEnumerable<T>
, comme le communisme, chaque élément se comporte de la même manière (un gars stupide a les mêmes droits qu'un génie).la source
C'est la meilleure façon de comprendre je pense.
Exemple de table de multiplication.
la source