(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

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

Projiziert jedes Element einer Sequenz in ein IEnumerable<T> und ruft für jedes Element darin eine Ergebnisauswahlfunktion auf. 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
)

Typparameter

TSource

Der Typ der Elemente von source.

TCollection

Der Typ der Zwischenelemente, die von der durch collectionSelector dargestellten Funktion erfasst werden.

TResult

Der Typ der Elemente in der resultierenden Sequenz.

Parameter

source
Typ: System.Linq.IQueryable<TSource>
Eine Sequenz von zu projizierenden Werten.
collectionSelector
Typ: System.Linq.Expressions.Expression<Func<TSource, IEnumerable<TCollection>>>
Eine Projektionsfunktion, die auf jedes Element der Eingabesequenz angewendet werden soll.
resultSelector
Typ: System.Linq.Expressions.Expression<Func<TSource, TCollection, TResult>>
Eine Projektionsfunktion, die auf jedes Element jeder Zwischensequenz angewendet werden soll.

Rückgabewert

Typ: System.Linq.IQueryable<TResult>
Ein IQueryable<T>, dessen Elemente erzeugt werden, indem für jedes Element von source die 1:n-Projektionsfunktion collectionSelector aufgerufen wird und dann jedes so erzeugte Element der Sequenz und sein entsprechendes source-Element einem Ergebniselement zugeordnet werden.

Hinweis zur Verwendung

In Visual Basic und C# können Sie diese Methode als Instanzenmethode für ein beliebiges Objekt vom Typ IQueryable<TSource> aufrufen. Bei Verwendung der Syntax für Instanzenmethoden lassen Sie den ersten Parameter aus. Weitere Informationen finden Sie unter Erweiterungsmethoden (Visual Basic) und Erweiterungsmethoden (C#-Programmierhandbuch).

AusnahmeBedingung
ArgumentNullException

source, collectionSelector oder resultSelector ist null.

Diese Methode verfügt über mindestens einen Parameter vom Typ Expression<TDelegate>, dessen Typargument einer der Func<T, TResult>-Typen ist. Für diese Parameter können Sie einen Lambda-Ausdruck übergeben, und dieser wird zu einer Expression<TDelegate> kompiliert.

Die SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>)-Methode generiert einen MethodCallExpression, der den Aufruf von SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) durch sich selbst als konstruierte generische Methode darstellt. Anschließend übergibt sie die MethodCallExpression an die CreateQuery(Expression)-Methode des IQueryProvider, der von der Provider-Eigenschaft des source-Parameters dargestellt wird.

Das Abfrageverhalten, das durch das Ausführen einer Ausdrucksbaumstruktur auftritt, die einen Aufruf von SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) darstellt, hängt von der Implementierung des Typs des source-Parameters ab. Es wird erwartet, dass collectionSelector für jedes Element von source aufgerufen wird, um es in ein auflistbares Format zu projizieren. Anschließend wird die durch resultSelector dargestellte Funktion für jedes Element in der Zwischensequenz aufgerufen. Die Ergebniswerte werden zu einer einzigen eindimensionalen Sequenz verkettet.

Im folgenden Codebeispiel wird veranschaulicht, wie mithilfe von SelectMany<TSource, TCollection, TResult>(IQueryable<TSource>, Expression<Func<TSource, IEnumerable<TCollection>>>, Expression<Func<TSource, TCollection, TResult>>) eine 1:n-Projektion über einem Array ausgeführt wird. In diesem Beispiel wird eine Ergebnisauswahlfunktion verwendet, um das Quellelement, das der jeweiligen Zwischensequenz entspricht, im Gültigkeitsbereich für den letzten Aufruf von Select zu lassen.


            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 }
            */



.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft