Queryable.Join 方法

定义

基于匹配键对两个序列的元素进行关联。

重载

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

Source:
Queryable.cs
Source:
Queryable.cs
Source:
Queryable.cs

基于匹配键对两个序列的元素进行关联。 使用默认的相等比较器对键进行比较。

C#
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);

类型参数

TOuter

第一个序列中的元素的类型。

TInner

第二个序列中的元素的类型。

TKey

键选择器函数返回的键的类型。

TResult

结果元素的类型。

参数

outer
IQueryable<TOuter>

要联接的第一个序列。

inner
IEnumerable<TInner>

要与第一个序列联接的序列。

outerKeySelector
Expression<Func<TOuter,TKey>>

用于从第一个序列的每个元素提取联接键的函数。

innerKeySelector
Expression<Func<TInner,TKey>>

用于从第二个序列的每个元素提取联接键的函数。

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

用于从两个匹配元素创建结果元素的函数。

返回

IQueryable<TResult>

一个 IQueryable<T>,具有通过对两个序列执行内部联接而获得的 TResult 类型的元素。

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

示例

下面的代码示例演示如何使用 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) 执行基于公共键的两个序列的内部联接。

C#
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
*/

注解

此方法至少有一个类型的 Expression<TDelegate> 参数,其类型参数是其中一种 Func<T,TResult> 类型。 对于这些参数,可以传入 lambda 表达式,它将编译为 Expression<TDelegate>

方法 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) 生成一个 , MethodCallExpression 表示将调用 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) 自身作为构造的泛型方法。 然后,MethodCallExpressionCreateQuery<TElement>(Expression)它将 传递给 由 Provider 参数的 属性表示的 的 outer 方法IQueryProvider

由于执行表示调用 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>) 的表达式树而发生的查询行为取决于参数类型的 outer 实现。 预期的行为是内部联接的行为。 outerKeySelectorinnerKeySelector 函数分别用于从 outerinner中提取密钥。 比较这些键的相等性,以匹配每个序列中的元素。 中与 中的 inner 元素匹配的每个元素存储一对元素 outer。 然后调用 resultSelector 函数,从每对匹配的元素中投影结果对象。

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

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

Source:
Queryable.cs
Source:
Queryable.cs
Source:
Queryable.cs

基于匹配键对两个序列的元素进行关联。 使用指定的 IEqualityComparer<T> 对键进行比较。

C#
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);
C#
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);

类型参数

TOuter

第一个序列中的元素的类型。

TInner

第二个序列中的元素的类型。

TKey

键选择器函数返回的键的类型。

TResult

结果元素的类型。

参数

outer
IQueryable<TOuter>

要联接的第一个序列。

inner
IEnumerable<TInner>

要与第一个序列联接的序列。

outerKeySelector
Expression<Func<TOuter,TKey>>

用于从第一个序列的每个元素提取联接键的函数。

innerKeySelector
Expression<Func<TInner,TKey>>

用于从第二个序列的每个元素提取联接键的函数。

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

用于从两个匹配元素创建结果元素的函数。

comparer
IEqualityComparer<TKey>

用于对键进行哈希处理和比较的 IEqualityComparer<T>

返回

IQueryable<TResult>

一个 IQueryable<T>,具有通过对两个序列执行内部联接而获得的 TResult 类型的元素。

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

注解

此方法至少有一个类型的 Expression<TDelegate> 参数,其类型参数是其中一种 Func<T,TResult> 类型。 对于这些参数,可以传入 lambda 表达式,它将编译为 Expression<TDelegate>

方法 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) 生成一个 , MethodCallExpression 表示将调用 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) 自身作为构造的泛型方法。 然后,MethodCallExpressionCreateQuery<TElement>(Expression)它将 传递给 由 Provider 参数的 属性表示的 的 outer 方法IQueryProvider

由于执行表示调用 Join<TOuter,TInner,TKey,TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter,TKey>>, Expression<Func<TInner,TKey>>, Expression<Func<TOuter,TInner,TResult>>, IEqualityComparer<TKey>) 的表达式树而发生的查询行为取决于参数类型的 outer 实现。 预期的行为是内部联接的行为。 outerKeySelectorinnerKeySelector 函数分别用于从 outerinner中提取密钥。 通过使用 comparer来比较这些键的相等性。 比较的结果用于为 中与 中的innerouter元素匹配的每个元素创建匹配对。 然后调用 resultSelector 函数,从每对匹配的元素中投影结果对象。

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0