Partilhar via


Queryable.Join Método

Definição

Correlaciona os elementos de duas sequências com base em chaves correspondentes.

Sobrecargas

Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>)

Correlaciona os elementos de duas sequências com base em chaves correspondentes. O comparador de igualdade padrão é usado para comparar chaves.

Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>)

Correlaciona os elementos de duas sequências com base em chaves correspondentes. Um IEqualityComparer<T> especificado é usado para comparar chaves.

Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>)

Origem:
Queryable.cs
Origem:
Queryable.cs
Origem:
Queryable.cs

Correlaciona os elementos de duas sequências com base em chaves correspondentes. O comparador de igualdade padrão é usado para comparar chaves.

public:
generic <typename TOuter, typename TInner, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Linq::IQueryable<TResult> ^ Join(System::Linq::IQueryable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, System::Linq::Expressions::Expression<Func<TOuter, TKey> ^> ^ outerKeySelector, System::Linq::Expressions::Expression<Func<TInner, TKey> ^> ^ innerKeySelector, System::Linq::Expressions::Expression<Func<TOuter, TInner, TResult> ^> ^ resultSelector);
public static System.Linq.IQueryable<TResult> Join<TOuter,TInner,TKey,TResult> (this System.Linq.IQueryable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, System.Linq.Expressions.Expression<Func<TOuter,TKey>> outerKeySelector, System.Linq.Expressions.Expression<Func<TInner,TKey>> innerKeySelector, System.Linq.Expressions.Expression<Func<TOuter,TInner,TResult>> resultSelector);
static member Join : System.Linq.IQueryable<'Outer> * seq<'Inner> * System.Linq.Expressions.Expression<Func<'Outer, 'Key>> * System.Linq.Expressions.Expression<Func<'Inner, 'Key>> * System.Linq.Expressions.Expression<Func<'Outer, 'Inner, 'Result>> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function Join(Of TOuter, TInner, TKey, TResult) (outer As IQueryable(Of TOuter), inner As IEnumerable(Of TInner), outerKeySelector As Expression(Of Func(Of TOuter, TKey)), innerKeySelector As Expression(Of Func(Of TInner, TKey)), resultSelector As Expression(Of Func(Of TOuter, TInner, TResult))) As IQueryable(Of TResult)

Parâmetros de tipo

TOuter

O tipo dos elementos da primeira sequência.

TInner

O tipo dos elementos da segunda sequência.

TKey

O tipo das chaves retornadas pelas funções do seletor de chave.

TResult

O tipo dos elementos de resultado.

Parâmetros

outer
IQueryable<TOuter>

A primeira sequência a ser unida.

inner
IEnumerable<TInner>

A sequência a ser unida à primeira sequência.

outerKeySelector
Expression<Func<TOuter,TKey>>

Uma função para extrair a chave de junção de cada elemento da primeira sequência.

innerKeySelector
Expression<Func<TInner,TKey>>

Uma função para extrair a chave de junção de cada elemento da segunda sequência.

resultSelector
Expression<Func<TOuter,TInner,TResult>>

Uma função para criar um elemento de resultado a partir de dois elementos correspondentes.

Retornos

IQueryable<TResult>

Um IQueryable<T> que tem elementos do tipo TResult obtidos executando uma junção interna em duas sequências.

Exceções

outer ou inner ou outerKeySelector ou innerKeySelector ou resultSelector é null.

Exemplos

O exemplo de código a seguir demonstra como usar Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) para executar uma junção interna de duas sequências com base em uma chave comum.

class Person
{
    public string Name { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

public static void JoinEx1()
{
    Person magnus = new Person { Name = "Hedlund, Magnus" };
    Person terry = new Person { Name = "Adams, Terry" };
    Person charlotte = new Person { Name = "Weiss, Charlotte" };

    Pet barley = new Pet { Name = "Barley", Owner = terry };
    Pet boots = new Pet { Name = "Boots", Owner = terry };
    Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
    Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

    List<Person> people = new List<Person> { magnus, terry, charlotte };
    List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };

    // Join the list of Person objects and the list of Pet objects
    // to create a list of person-pet pairs where each element is
    // an anonymous type that contains the name of pet and the name
    // of the person that owns the pet.
    var query = people.AsQueryable().Join(pets,
                    person => person,
                    pet => pet.Owner,
                    (person, pet) =>
                        new { OwnerName = person.Name, Pet = pet.Name });

    foreach (var obj in query)
    {
        Console.WriteLine(
            "{0} - {1}",
            obj.OwnerName,
            obj.Pet);
    }
}

/*
    This code produces the following output:

    Hedlund, Magnus - Daisy
    Adams, Terry - Barley
    Adams, Terry - Boots
    Weiss, Charlotte - Whiskers
*/
Structure Person
    Public Name As String
End Structure

Structure Pet
    Public Name As String
    Public Owner As Person
End Structure

Shared Sub JoinEx1()
    Dim magnus As New Person With {.Name = "Hedlund, Magnus"}
    Dim terry As New Person With {.Name = "Adams, Terry"}
    Dim charlotte As New Person With {.Name = "Weiss, Charlotte"}

    Dim barley As New Pet With {.Name = "Barley", .Owner = terry}
    Dim boots As New Pet With {.Name = "Boots", .Owner = terry}
    Dim whiskers As New Pet With {.Name = "Whiskers", .Owner = charlotte}
    Dim daisy As New Pet With {.Name = "Daisy", .Owner = magnus}

    Dim people As New List(Of Person)(New Person() {magnus, terry, charlotte})
    Dim pets As New List(Of Pet)(New Pet() {barley, boots, whiskers, daisy})

    ' Join the list of Person objects and the list of Pet objects 
    ' to create a list of person-pet pairs where each element is 
    ' an anonymous type that contains pet's name and the name of the
    ' Person object that owns the pet.
    Dim query = people.AsQueryable().Join(pets, _
                    Function(person) person, _
                    Function(pet) pet.Owner, _
                    Function(person, pet) _
                        New With {.OwnerName = person.Name, .Pet = pet.Name})

    Dim output As New System.Text.StringBuilder
    For Each obj In query
        output.AppendLine(String.Format( _
            "{0} - {1}", obj.OwnerName, obj.Pet))
    Next

    ' Display the output.
    MsgBox(output.ToString())
End Sub

' This code produces the following output:

' Hedlund, Magnus - Daisy
' Adams, Terry - Barley
' Adams, Terry - Boots
' Weiss, Charlotte - Whiskers

Comentários

Esse método tem pelo menos um parâmetro de tipo Expression<TDelegate> cujo argumento de tipo é um dos tipos de Func<T,TResult>. Para esses parâmetros, você pode passar uma expressão lambda e ela será compilada para um Expression<TDelegate>.

O método Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) gera um MethodCallExpression que representa a chamada Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) si mesmo como um método genérico construído. Em seguida, ele passa o MethodCallExpression para o método CreateQuery<TElement>(Expression) do IQueryProvider representado pela propriedade Provider do parâmetro outer.

O comportamento da consulta que ocorre como resultado da execução de uma árvore de expressão que representa a chamada Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) depende da implementação do tipo do parâmetro outer. O comportamento esperado é o de uma junção interna. As funções outerKeySelector e innerKeySelector são usadas para extrair chaves de outer e inner, respectivamente. Essas chaves são comparadas quanto à igualdade para corresponder aos elementos de cada sequência. Um par de elementos é armazenado para cada elemento em inner que corresponde a um elemento em outer. Em seguida, a função resultSelector é invocada para projetar um objeto de resultado de cada par de elementos correspondentes.

Aplica-se a

Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>)

Origem:
Queryable.cs
Origem:
Queryable.cs
Origem:
Queryable.cs

Correlaciona os elementos de duas sequências com base em chaves correspondentes. Um IEqualityComparer<T> especificado é usado para comparar chaves.

public:
generic <typename TOuter, typename TInner, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Linq::IQueryable<TResult> ^ Join(System::Linq::IQueryable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, System::Linq::Expressions::Expression<Func<TOuter, TKey> ^> ^ outerKeySelector, System::Linq::Expressions::Expression<Func<TInner, TKey> ^> ^ innerKeySelector, System::Linq::Expressions::Expression<Func<TOuter, TInner, TResult> ^> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Linq.IQueryable<TResult> Join<TOuter,TInner,TKey,TResult> (this System.Linq.IQueryable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, System.Linq.Expressions.Expression<Func<TOuter,TKey>> outerKeySelector, System.Linq.Expressions.Expression<Func<TInner,TKey>> innerKeySelector, System.Linq.Expressions.Expression<Func<TOuter,TInner,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Linq.IQueryable<TResult> Join<TOuter,TInner,TKey,TResult> (this System.Linq.IQueryable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, System.Linq.Expressions.Expression<Func<TOuter,TKey>> outerKeySelector, System.Linq.Expressions.Expression<Func<TInner,TKey>> innerKeySelector, System.Linq.Expressions.Expression<Func<TOuter,TInner,TResult>> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member Join : System.Linq.IQueryable<'Outer> * seq<'Inner> * System.Linq.Expressions.Expression<Func<'Outer, 'Key>> * System.Linq.Expressions.Expression<Func<'Inner, 'Key>> * System.Linq.Expressions.Expression<Func<'Outer, 'Inner, 'Result>> * System.Collections.Generic.IEqualityComparer<'Key> -> System.Linq.IQueryable<'Result>
<Extension()>
Public Function Join(Of TOuter, TInner, TKey, TResult) (outer As IQueryable(Of TOuter), inner As IEnumerable(Of TInner), outerKeySelector As Expression(Of Func(Of TOuter, TKey)), innerKeySelector As Expression(Of Func(Of TInner, TKey)), resultSelector As Expression(Of Func(Of TOuter, TInner, TResult)), comparer As IEqualityComparer(Of TKey)) As IQueryable(Of TResult)

Parâmetros de tipo

TOuter

O tipo dos elementos da primeira sequência.

TInner

O tipo dos elementos da segunda sequência.

TKey

O tipo das chaves retornadas pelas funções do seletor de chave.

TResult

O tipo dos elementos de resultado.

Parâmetros

outer
IQueryable<TOuter>

A primeira sequência a ser unida.

inner
IEnumerable<TInner>

A sequência a ser unida à primeira sequência.

outerKeySelector
Expression<Func<TOuter,TKey>>

Uma função para extrair a chave de junção de cada elemento da primeira sequência.

innerKeySelector
Expression<Func<TInner,TKey>>

Uma função para extrair a chave de junção de cada elemento da segunda sequência.

resultSelector
Expression<Func<TOuter,TInner,TResult>>

Uma função para criar um elemento de resultado a partir de dois elementos correspondentes.

comparer
IEqualityComparer<TKey>

Um IEqualityComparer<T> ao hash e às chaves de comparação.

Retornos

IQueryable<TResult>

Um IQueryable<T> que tem elementos do tipo TResult obtidos executando uma junção interna em duas sequências.

Exceções

outer ou inner ou outerKeySelector ou innerKeySelector ou resultSelector é null.

Comentários

Esse método tem pelo menos um parâmetro de tipo Expression<TDelegate> cujo argumento de tipo é um dos tipos de Func<T,TResult>. Para esses parâmetros, você pode passar uma expressão lambda e ela será compilada para um Expression<TDelegate>.

O método Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) gera um MethodCallExpression que representa a chamada Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) si mesmo como um método genérico construído. Em seguida, ele passa o MethodCallExpression para o método CreateQuery<TElement>(Expression) do IQueryProvider representado pela propriedade Provider do parâmetro outer.

O comportamento da consulta que ocorre como resultado da execução de uma árvore de expressão que representa a chamada Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) depende da implementação do tipo do parâmetro outer. O comportamento esperado é o de uma junção interna. As funções outerKeySelector e innerKeySelector são usadas para extrair chaves de outer e inner, respectivamente. Essas chaves são comparadas para igualdade usando comparer. O resultado das comparações é usado para criar um par correspondente para cada elemento em inner que corresponde a um elemento em outer. Em seguida, a função resultSelector é invocada para projetar um objeto de resultado de cada par de elementos correspondentes.

Aplica-se a