原文起始连接:https://dotnettutorials.net/course/linq/
说明:翻译接上篇,上一篇介绍了LINQ中的排序、聚合、分组、量化等操作。本篇继续介绍LINQ中的其他操作。包括Join、GroupJoin、Cross Join、Left Join。以及针对数据源元素的操作。
LINQ连接操作
和SQL连接操作一样,用于连接两个数据源。LINQ中提供下面两个方法:
- Join 连接两个数据源,返回一个数据
- GroupJoin 连接两个数据源,返回一组数据
Inner Join方法
首先来看Join方法的签名。从签名中可以看出,理解Linq中的Join,需要理解一下5个内容
- Outer data source 外部数据源
- Inner data source 内部数据源
- Outer Key selector 外部数据源的键
- Inner Key selector 内部数据源的键
- Result selector 将数据映射到结果集
1 | 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); |
实例数据
1 | public class Employee |
Join的使用方法
1 | var joinMS = Employee.GetAllEmployees() //Outer data source |
多数据源联合查询
1 | var multipleJoinQS = from emp in Employee.GetAllEmployees() |
译者注:原文中关于Join方法的Method方式这段代码片段是有问题的。实际上Inner Key和Outter Key就是SQL中join中用来连接的两个表中的键。
GroupJoin
GroupJoin用于通过共有的键将多个数据源连接,返回的数据结果以分组方式。
1 | var groupMS = Department.GetAllDepartments() |
Left Join
Left Join类似于SQL中的left join,看本文开头的图,左侧表数据将全部输出,而连接的表中如果没有对应的数据则显示空。LINQ中没有现成的left join方法,通过借助GroupJoin 和 SelectMany来实现。
1 | var LeftOuterJoinQS = from emp in Employee.GetAllEmployees() |
Cross Join
cross join返回两个集合的笛卡尔积,即第一个集合中的每个元素都会映射到第二个集合的每个元素。下面举例如何使用查询语法和SelectMany方法来实现cross join:
1 | var crossJoinMS = Student.GetAllStudnets() |
LINQ中的元素操作
LINQ元素操作用于针对数据源索引来返回单个元素,或者基于断言条件来返回。可以针对一个数据源,或多数据源的查询来返回。主要有以下几个方法来实现元素操作:
- ElementAt and ElementAtOrDefault 返回指定索引处的元素
- First and FirstOrDefault 返回第一个符合断言条件的值
- Last and LastOrDefault 返回最后一个符合断言条件的值
- Single and SingleOrDefault 返回一个值
- DefaultEmpty
下面举例各方法的使用:
1 | List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; |
LINQ中的SequenceEqual
从这个名字就大概能理解这个操作方法的作用,用于比较两个数据源是否相等。两个数据源相等的话,需要数据集合长度一样、每个元素值一样。先来看看SequenceEqual方法的两个签名
1 | public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second); |
看到这两个方法签名,应该比较熟悉了。默认传递两个数据源集合,第二个方法签名,允许传递一个自定义的IEqualityComparer接口,说明处理复杂类数据源比较的时候,需要自己实现比较方法。下面看两个例子:
1 | List<string> cityList1 = new List<string> { "Delhi", "Mumbai", "Hyderabad" }; |
上面例子列举了SequenceEqual的用法,如果数据源中的元素为复杂类,那么进行比较的方法类似于Distinct方法中介绍的4种方法。
- 本文作者: 达文西
- 本文链接: https://edsiongithub.github.io/2022/03/31/33/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!