Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Queryable.SelectMany<TSource, TCollection, TResult>-Methode: (IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>)

 

Veröffentlicht: Oktober 2016

Projiziert jedes Element einer Sequenz in ein IEnumerable<T> und ruft Sie darin eine Ergebnisauswahlfunktion auf jedes Element. Die Ergebniswerte aus jeder Zwischensequenz werden zu einer einzigen eindimensionalen Sequenz zusammengefasst und zurückgegeben.

Namespace:   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
)

Parameter

source
Type: System.Linq.IQueryable<TSource>

Eine Sequenz von zu projizierenden Werten.

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

Eine Projektionsfunktion auf jedes Element der Eingabesequenz angewendet werden soll.

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

Eine Projektionsfunktion auf jedes Element der Zwischensequenz angewendet werden soll.

Rückgabewert

Type: System.Linq.IQueryable<TResult>

Ein IQueryable<T> dessen Elemente das Ergebnis des Aufrufs der 1: n-Projektionsfunktion sind collectionSelector für jedes Element der source und die anschließende Zuordnung jedes dieser Sequenzelemente und ihrer entsprechenden source Element zu einem Ergebniselement.

Typparameter

TSource

Der Typ der Elemente von source.

TCollection

Der Typ der Zwischenelemente, erfasst von der Funktion als collectionSelector.

TResult

Der Typ der Elemente der resultierenden Sequenz.

Exception Condition
ArgumentNullException

source oder collectionSelector oder resultSelector ist null.

Diese Methode verfügt über mindestens einen Parameter vom Typ Expression<TDelegate> deren Typargument ist eines der Func<T, TResult> Typen. Für diese Parameter können Sie einen Lambda-Ausdruck übergeben, und es werden kompiliert, um eine Expression<TDelegate>.

Die SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) -Methode generiert eine MethodCallExpression Aufruf darstellt SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) sich selbst als konstruierte generische Methode. Anschließend übergibt der MethodCallExpression zu der CreateQuery(Expression) Methode der IQueryProvider durch dargestellt die Provider Eigenschaft der source Parameter.

Das Abfrageverhalten durch das Ausführen einer Ausdrucksbaumstruktur, die aufrufende darstellt, SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) hängt von der Implementierung des Typs der source Parameter. Wird erwartet, dass er ruft collectionSelector für jedes Element der source in ein enumerable-Formular zu projizieren. Und dann die Funktion durch dargestellt resultSelector für jedes Element in jeder Sequenz intermediate aufgerufen wird. Die resultierenden Werte werden in einer einzigen eindimensionalen Sequenz verkettet.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) um eine 1: n-Projektion über einem Array ausgeführt. In diesem Beispiel wird eine Ergebnisauswahlfunktion verwendet, um das Quellelement auf jede intermediate Sequenz im Gültigkeitsbereich für den letzten Aufruf von entspricht, 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 }
*/

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 3.5
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.1
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: