猿教程 Logo

Linq连接运算符:Join

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

连接运算符连接两个序列(集合)并产生结果。

连接运算符用法
JoinJoin运算符基于键来连接两个序列(集合),并返回结果序列。
GroupJoinGroupJoin运算符根据键连接两个序列,并返回序列组。 它就像是Left Outer Join的SQL。

Join:

Join运算符操作两个集合,内部集合和外部集合。 它返回一个新集合,其中包含来自两个满足指定表达式的集合的元素。 它与SQL的内连接相同。

方法语法中的Join:

Join扩展方法有两个重载,如下所示。

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, 
                                                        IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, 
                                                        Func<TInner, TKey> innerKeySelector, 
                                                        Func<TOuter, TInner, TResult> resultSelector);

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, 
                                                        IEnumerable<TInner> inner, 
                                                        Func<TOuter, TKey> outerKeySelector,
                                                        Func<TInner, TKey> innerKeySelector, 
                                                        Func<TOuter, TInner, TResult> resultSelector,
                                                        IEqualityComparer<TKey> comparer);

如你所见,第一个重载方法需要五个输入参数(除了第一个'this'参数):1)outer 2)inner 3)outerKeySelector 4)innerKeySelector 5)resultSelector。

让我们举个简单的例子。 以下示例连接两个字符串集合并返回新集合,其中包括集合中的匹配字符串。

相关实例:

IList<string> strList1 = new List<string>() { 
    "One", 
    "Two", 
    "Three", 
    "Four"
};

IList<string> strList2 = new List<string>() { 
    "One", 
    "Two", 
    "Five", 
    "Six"
};

var innerJoin = strList1.Join(strList2,
                      str1 => str1, 
                      str2 => str2, 
                      (str1, str2) => str1);

运行结果:

One 
Two

现在,让我们来了解使用以下Student和Standard类的join方法,其中Student类包括与Standard类的StandardID匹配的StandardID。

相关实例:

public class Student{ 
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int StandardID { get; set; }
}

public class Standard{ 
    public int StandardID { get; set; }
    public string StandardName { get; set; }
}

以下示例演示了LINQ Join查询。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", StandardID =1 },
    new Student() { StudentID = 2, StudentName = "Moin", StandardID =1 },
    new Student() { StudentID = 3, StudentName = "Bill", StandardID =2 },
    new Student() { StudentID = 4, StudentName = "Ram" , StandardID =2 },
    new Student() { StudentID = 5, StudentName = "Ron"  } 
};

IList<Standard> standardList = new List<Standard>() { 
    new Standard(){ StandardID = 1, StandardName="Standard 1"},
    new Standard(){ StandardID = 2, StandardName="Standard 2"},
    new Standard(){ StandardID = 3, StandardName="Standard 3"}
};

var innerJoin = studentList.Join(// outer sequence 
                      standardList,  // inner sequence 
                      student => student.StandardID,    // outerKeySelector
                      standard => standard.StandardID,  // innerKeySelector
                      (student, standard) => new  // result selector
                                    {
                                        StudentName = student.StudentName,
                                        StandardName = standard.StandardName
                                    });

下图说明了上例中Join运算符的部分。


在上面的连接查询示例中,studentList是外部序列,因为查询从它开始。 Join方法中的第一个参数用于指定上面示例中的standardList的内部序列。 Join方法的第二和第三个参数用于使用lambda表达式指定其值应匹配的字段,以便在结果中包含元素。 外部序列student => student.StandardID的键选择器表示takeList的每个元素的standardID字段应该与内部序列的键=> standard.StandardID匹配。 如果两个键字段的值都匹配,那么将该元素包含到结果中。

Join方法中的最后一个参数是用于表达结果的表达式。 在上面的示例中,结果选择器包含序列的StudentName和StandardName属性。

StandardID两个序列(集合)的键必须匹配,否则项目不会包括在结果中。 例如,Ron未与任何标准关联,因此Ron不包括在结果集合中。 在上面的例子中,innerJoinResult将在执行后包含以下元素:

运行结果:

John - Standard 1 
Moin - Standard 1 
Bill - Standard 2 
Ram - Standard 2

以下示例演示了VB.Net中的方法语法中的Join运算符。

相关实例:

Dim innerJoin = studentList.Join(standardList, 
                                    Function(s) s.StandardID, 
                                    Function(std) std.StandardID, 
                                    Function(s, std) New With 
                                    {
                                        .StudentName = s.StudentName, 
                                        .StandardName = std.StandardName
                                    });

查询语法中的Join:

查询语法中的Join运算符与方法语法略有不同。 它需要外层序列,内层序列,key选择器和结果选择器。 'on'关键字用于键选择器,其中“等于”运算符的左侧为outerKeySelector,“等于”的右侧为innerKeySelector。

相关实例:

from ... in outerSequence 
        join ... in innerSequence  
        on outerKey equals innerKey 
        select ...

下面的查询语法中的Join运算符示例返回studentList和standardList中的元素的集合,条件是它们的Student.StandardID和Standard.StandardID匹配。

相关实例:

IList<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 13, StandardID =1 },
    new Student() { StudentID = 2, StudentName = "Moin",  Age = 21, StandardID =1 },
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 18, StandardID =2 },
    new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID =2 },
    new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
};

IList<Standard> standardList = new List<Standard>() { 
    new Standard(){ StandardID = 1, StandardName="Standard 1"},
    new Standard(){ StandardID = 2, StandardName="Standard 2"},
    new Standard(){ StandardID = 3, StandardName="Standard 3"}
};

var innerJoin = from s in studentList // outer sequence
                      join st in standardList //inner sequence 
                      on s.StandardID equals st.StandardID // key selector 
                      select new { // result selector 
                                    StudentName = s.StudentName, 
                                    StandardName = st.StandardName 
                                };

相关实例:

Dim innerJoin = From s In studentList ' outer sequence
                      Join std In standardList  ' inner sequence 
                      On s.StandardID Equals std.StandardID ' key selector 
                      Select _  ' result selector
                            StudentName = s.StudentName,
                            StandardName = std.StandardName

运行结果:

John - Standard 1 
Moin - Standard 1 
Bill - Standard 2 
Ram - Standard 2
注意

在查询语法中匹配键选择器使用equals运算符。== 无效。

要点
  1. Join和GroupJoin属于连接运算符。 

  2. Join就像SQL的内部连接。 它返回一个新的集合,其中包含两个集合的共享元素。 

  3. Join对两个序列内部序列和外部序列进行操作,并产生结果序列。 

  4. 连接查询语法:from ... in outerSequence join ... in innerSequence on outerKey equals innerKey select ...

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-joining-operator-join.html