Estive pesquisando a diferença entre Select
e SelectMany
não consegui encontrar uma resposta adequada. Preciso aprender a diferença ao usar o LINQ To SQL, mas tudo o que encontrei são exemplos de matriz padrão.
Alguém pode fornecer um exemplo de LINQ To SQL?
c#
linq-to-sql
linq
Tarik
fonte
fonte
Respostas:
SelectMany
facilita as consultas que retornam listas de listas. Por exemploDemonstração ao vivo no .NET Fiddle
fonte
Selecionar muitos é como uma operação de junção cruzada no SQL, onde ele leva o produto cruzado.
Por exemplo, se tivermos
Selecione muitos podem ser usados para obter o seguinte conjunto
Observe que aqui tomamos todas as combinações possíveis que podem ser feitas a partir dos elementos do conjunto A e do conjunto B.
Aqui está um exemplo de LINQ que você pode tentar
a mistura terá os seguintes elementos em estrutura plana como
fonte
SelectMany
é . Pelo contrário, esta é uma maneira queSelectMany
pode ser usada, mas na verdade não é a maneira normal de usá-lo.Where
condição após SelectMany...
fonte
SelectMany()
permite recolher uma sequência multidimensional de uma maneira que exigiria um segundoSelect()
ou loop.Mais detalhes nesta postagem do blog .
fonte
Existem várias sobrecargas para
SelectMany
. Um deles permite rastrear qualquer relacionamento entre pai e filhos enquanto percorre a hierarquia.Exemplo : suponha que você tem a seguinte estrutura:
League -> Teams -> Player
.Você pode retornar facilmente uma coleção plana de jogadores. No entanto, você pode perder qualquer referência à equipe da qual o jogador faz parte.
Felizmente, há uma sobrecarga para esse fim:
O exemplo anterior foi retirado do blog IK de Dan . Eu recomendo fortemente que você dê uma olhada nisso.
fonte
Compreendo
SelectMany
funcionar como um atalho de associação.Então você pode:
fonte
.SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate});
não funcionaria. SelectMany está bastante achatando a lista de listas - e você pode escolher qualquer (mas apenas uma de cada vez) das listas contidas para o resultado. Para comparação: junção interna no Linq .Selecionar é uma projeção individual simples do elemento de origem para o elemento de resultado. Selecionar - Muitos é usado quando há várias cláusulas from em uma expressão de consulta: cada elemento na sequência original é usado para gerar uma nova sequência.
fonte
Alguns SelectMany podem não ser necessários. Abaixo de 2 consultas, obtém o mesmo resultado.
Para o relacionamento de um para muitos,
fonte
Sem ser muito técnico - banco de dados com muitas organizações, cada um com muitos usuários: -
ambos retornam o mesmo lista ApplicationUser para a organização selecionada.
Os primeiros "projetos" da Organização para os Usuários, o segundo consulta diretamente a tabela Usuários.
fonte
É mais claro quando a consulta retorna uma string (uma matriz de caracteres):
Por exemplo, se a lista 'Frutas' contiver 'maçã'
'Select' retorna a string:
'SelectMany' nivela a string:
fonte
Apenas para uma visão alternativa que pode ajudar alguns programadores funcionais por aí:
Select
émap
SelectMany
ébind
(ouflatMap
para o seu pessoal da Scala / Kotlin)fonte
Considere este exemplo:
Portanto, como você vê, valores duplicados como "I" ou "like" foram removidos da query2 porque "SelectMany" nivela e projeta em várias seqüências. Mas query1 retorna a sequência de matrizes de string. e como existem duas matrizes diferentes na query1 (primeiro e segundo elemento), nada seria removido.
fonte
Mais um exemplo de como o SelectMany + Select pode ser usado para acumular dados de objetos de sub array.
Suponha que tenhamos usuários com seus telefones:
Agora precisamos selecionar as BaseParts de todos os telefones de todos os usuários:
fonte
usersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))
Aqui está um exemplo de código com uma pequena coleção inicializada para teste:
fonte
Os
SelectMany
método derruba umIEnumerable<IEnumerable<T>>
em umIEnumerable<T>
, como o comunismo, cada elemento é comportado da mesma maneira (um cara estúpido tem mesmos direitos de um gênio).fonte
É a melhor maneira de entender, eu acho.
Exemplo da tabela de multiplicação.
fonte