Este tema aún no ha recibido ninguna valoración - Valorar este tema

Queryable.SelectMany<TSource, TCollection, TResult> (Método) (IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>)

Actualización: noviembre 2007

Proyecta cada elemento de una secuencia en IEnumerable<T> e invoca una función del selector de resultados en cada elemento. Los valores resultantes de cada secuencia intermedia se combinan en una única secuencia unidimensional y se devuelven.

Espacio de nombres:  System.Linq
Ensamblado:  System.Core (en System.Core.dll)
public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult>(
	this IQueryable<TSource> source,
	Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector,
	Expression<Func<TSource, TCollection, TResult>> resultSelector
)

J# admite el uso de APIs genéricas pero no admite la declaración de nuevas API.
JScript no admite el uso de métodos ni tipos genéricos.

Parámetros de tipo

TSource

Tipo de los elementos de source.

TCollection

El tipo de los elementos intermedios recopilados por la función representada por collectionSelector.

TResult

Tipo de los elementos de la secuencia resultante.

Parámetros

source
Tipo: System.Linq.IQueryable<TSource>
Secuencia de valores que se va a proyectar.
collectionSelector
Tipo: System.Linq.Expressions.Expression<Func<TSource, IEnumerable<TCollection>>>
Función de proyección que se va a aplicar a cada elemento de la secuencia de entrada.
resultSelector
Tipo: System.Linq.Expressions.Expression<Func<TSource, TCollection, TResult>>
Función de proyección que se va a aplicar a cada elemento de la secuencia intermedia.

Valor devuelto

Tipo: System.Linq.IQueryable<TResult>
IQueryable<T> cuyos elementos son el resultado de invocar la función de proyección uno a varios collectionSelector en cada elemento de source y de asignar a continuación cada uno de los elementos de la secuencia y sus elementos de source correspondientes a un elemento de resultado.

Nota sobre el uso

En Visual Basic y C#, se puede llamar a este método como a un método de instancia en cualquier objeto de tipo IQueryable<TSource>. Cuando emplee la sintaxis del método de instancia para llamar a este método, omita el primer parámetro. Para obtener más información, vea Métodos de extensión (Visual Basic) o Métodos de extensión (Guía de programación de C#).
ExcepciónCondición
ArgumentNullException

source o collectionSelector o resultSelector es null.

Este método tiene al menos un parámetro de tipo Expression<TDelegate> cuyo argumento de tipo es uno de los tipos de Func<T, TResult>. En estos parámetros, puede pasar una expresión lambda y ésta se compilará en un objeto Expression<TDelegate>.

El método SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) genera un objeto MethodCallExpression que representa al propio método SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) que realiza la llamada como un método genérico construido. A continuación, pasa el objeto MethodCallExpression al método CreateQuery(Expression) de la interfaz IQueryProvider representada por la propiedad Provider del parámetro source.

El comportamiento de la consulta que se obtiene como resultado de ejecutar un árbol de expresión que representa al método SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) que realiza la llamada depende de la implementación del tipo del parámetro source. El comportamiento esperado es que invoque a collectionSelector en cada elemento de source para proyectarlo en un formulario enumerable. A continuación, la función representada por resultSelector se invoca en cada elemento de las secuencias intermedias. Los valores resultantes se concatenan en una única secuencia unidimensional.

En el ejemplo de código siguiente se muestra cómo se utiliza SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) para realizar una proyección uno a varios sobre una matriz. En este ejemplo se utiliza una función del selector de resultados para mantener el elemento de origen que se corresponde con cada secuencia intermedia en el ámbito de la llamada final a Select.

class PetOwner
{
    public string Name { get; set; }
    public List<Pet> Pets { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public string Breed { get; set; }
}

public static void SelectManyEx3()
{
    PetOwner[] petOwners =
        { new PetOwner { Name="Higa", 
              Pets = new List<Pet>{
                  new Pet { Name="Scruffy", Breed="Poodle" },
                  new Pet { Name="Sam", Breed="Hound" } } },
          new PetOwner { Name="Ashkenazi", 
              Pets = new List<Pet>{
                  new Pet { Name="Walker", Breed="Collie" },
                  new Pet { Name="Sugar", Breed="Poodle" } } },
          new PetOwner { Name="Price", 
              Pets = new List<Pet>{
                  new Pet { Name="Scratches", Breed="Dachshund" },
                  new Pet { Name="Diesel", Breed="Collie" } } },
          new PetOwner { Name="Hines", 
              Pets = new List<Pet>{
                  new Pet { Name="Dusty", Breed="Collie" } } }
        };

    // This query demonstrates how to obtain a sequence of
    // the names of all the pets whose breed is "Collie", while
    // keeping an association with the owner that owns the pet.
    var query =
        petOwners.AsQueryable()
        // Create a sequence of ALL the Pet objects. Then
        // project an anonymous type that consists of each
        // Pet in the new sequence and the PetOwner object
        // from the initial array that corresponds to that pet.
       .SelectMany(owner => owner.Pets,
                   (owner, pet) => new { owner, pet })
        // Filter the sequence of anonymous types to only
        // keep pets whose breed is "Collie".
        .Where(ownerAndPet => ownerAndPet.pet.Breed == "Collie")
        // Project an anonymous type that consists
        // of the pet owner's name and the pet's name.
        .Select(ownerAndPet => new
        {
            Owner = ownerAndPet.owner.Name,
            Pet = ownerAndPet.pet.Name
        });

    // Print the results.
    foreach (var obj in query)
        Console.WriteLine(obj);
}

/* This code produces the following output:

    { Owner = Ashkenazi, Pet = Walker }
    { Owner = Price, Pet = Diesel }
    { Owner = Hines, Pet = Dusty }
*/



Windows Vista, Windows XP SP2, Windows Server 2003

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5
¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.