Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Queryable.SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>)

 

Data di pubblicazione: ottobre 2016

Proietta ogni elemento di una sequenza a un IEnumerable<T> e richiama una funzione selettore di risultato su ogni elemento al suo interno. I valori risultanti da ogni sequenza intermedia vengono combinati in una singola sequenza unidimensionale e restituiti.

Spazio dei nomi:   System.Linq
Assembly:  System.Core (in 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
)

Parametri

source
Type: System.Linq.IQueryable<TSource>

Sequenza di valori da proiettare.

collectionSelector
Type: System.Linq.Expressions.Expression<Func<TSource, IEnumerable<TCollection>>>

Una funzione di proiezione da applicare a ogni elemento della sequenza di input.

resultSelector
Type: System.Linq.Expressions.Expression<Func<TSource, TCollection, TResult>>

Una funzione di proiezione da applicare a ogni elemento di ogni sequenza intermedia.

Valore restituito

Type: System.Linq.IQueryable<TResult>

Un IQueryable<T> i cui elementi sono il risultato ottenuto richiamando la funzione di proiezione uno-a-molti collectionSelector su ogni elemento di source e quindi il mapping di ogni sequenza e i relativi source elemento a un elemento di risultato.

Parametri tipo

TSource

Tipo degli elementi di source.

TCollection

Tipo degli elementi intermedi raccolti dalla funzione rappresentata da collectionSelector.

TResult

Tipo degli elementi della sequenza risultante.

Exception Condition
ArgumentNullException

Il parametro source, il parametro collectionSelector o il parametro resultSelector è null.

Questo metodo contiene almeno un parametro di tipo Expression<TDelegate> il cui argomento di tipo è uno del Func<T, TResult> tipi. Per questi parametri, è possibile passare un'espressione lambda e verrà compilato in un Expression<TDelegate>.

Il SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) metodo genera un MethodCallExpression che rappresenta una chiamata SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) stesso come un metodo generico costruito. Passa quindi il MethodCallExpression per il CreateQuery(Expression) metodo il IQueryProvider rappresentato dal Provider proprietà del source parametro.

Il comportamento della query che si verifica in seguito all'esecuzione di una struttura ad albero dell'espressione che rappresenta una chiamata SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) dipende dall'implementazione del tipo di source parametro. Il comportamento previsto è che richiami collectionSelector su ogni elemento di source per proiettarlo in una maschera enumerabile. Quindi la funzione rappresentata da resultSelector viene richiamato su ogni elemento in ogni sequenza intermedia. I valori risultanti vengono concatenati in una singola sequenza unidimensionale.

Esempio di codice seguente viene illustrato come utilizzare SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) per eseguire una proiezione di uno-a-molti su una matrice. In questo esempio utilizza una funzione del selettore di risultato per mantenere l'elemento di origine che corrisponde a ogni sequenza intermedia nell'ambito per la chiamata finale al 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 }
*/

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 3.5
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.1
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: