声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢!

一、编写Person与City类,如下:

     class Person
{
public int CityID { set; get; }
public string Name { set; get; }
}
class City
{
public int ID { set; get; }
public string Name { set; get; }
}

二、为以上两个类建立一些数据,存储于persons与cities中,如下:

     Person[] persons = new Person[]
{
new Person{ CityID = , Name = "ABC" },
new Person{ CityID = , Name = "EFG" },
new Person{ CityID = , Name = "HIJ" },
new Person{ CityID = , Name = "KLM" },
new Person{ CityID = , Name = "NOP" },
new Person{ CityID = , Name = "QRS" },
new Person{ CityID = , Name = "TUV" }
};
City[] cities = new City[]
{
new City{ ID = ,Name = "Guangzhou" },
new City{ ID = ,Name = "Shenzhen" },
new City{ ID = ,Name = "Beijing" },
new City{ ID = ,Name = "Shanghai" }
};

三、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);

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

这个与数据库中的INNER JOIN很类似,就是使用一个键(TKey)将两个集合关联起来,并对这两个集合的元素进行选择,作为结果输出。

1、数据源本身为outer,需要作Join连接的集合为inner;

2、选择一个outer内的一个元素,作为输入参数,并输出一个基于outer的键值;

3、选择一个inner内的一个元素,作为输入参数,并输出一个基于inner的键值;

4、将基于outer的键值与inner的键值作为输入参数,并输出一个自己定义类型的结果选择器;

5、返回的结果就是自己定义类型的集合。

编写客户端试验代码:

     var result =  persons.Join(cities, p => p.CityID, c => c.ID, (p, c) => new { PersonName = p.Name, CityName = c.Name});
foreach(var item in result)
{
Console.WriteLine($"{item.PersonName},{item.CityName}");
}

从以上可以看出,persons为outer集合,cities为inner集合,p.CityID为outer的键值,c.ID为inner的键值,Join就是将persons内CityID与cities内ID相等性连接起来,并将persons内的每个元素及cities内的每个元素作为输入参数,从从选择自己想要的数据,如自己定义的匿名类型。

因为persons内CityID为5的城市编号不存在与cIties内,因此输出结果不会含Name为“TUV”的信息。

输出结果如下:

其等价的LINQ语句为:

     var result = from p in persons
join c in cities on p.CityID equals c.ID
select new { PersonName = p.Name, CityName = c.Name };

四、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, IEqualityComparer<TKey> comparer);

官方释义:基于匹配键对两个序列的元素进行关联。使用指定的IEqualityComparer<TKey> 对键进行比较。

以上与Join第一种方法无非就是多一个IEqualityComparer<TKey>,如果使用一个继承于IEqualityComparer<TKey>的类初始化comparer,它就会使用该类对对TOuter.TKey及TInner.TKey进行相等性比较,判断是否进行连接,并输出自己定义的类型集合。

五、GroupJoin第一种方法:

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

官方释义: 基于键相等对两个序列的元素进行关联并对结果进行分组。使用默认的相等比较器对键进行比较。

这个与数据库的LEFT OUTER JOIN很类似。与Join的区别就是:GroupJoin内resultSelector的输入参数从TInner单个元素编程IEnumerable<TInner>元素集合,其他保持不变。用法与Join差不多,它也是基于TOuter.TKey及TInner.TKey的连接。

编写客户端试验代码:

     var result = persons.GroupJoin(cities, p => p.CityID, c => c.ID, (p, cs) => new { PersonName = p.Name, Citys = cs });
foreach (var item in result)
{
Console.Write($"{item.PersonName}\t");
foreach (var city in item.Citys)
{
Console.Write($"{city.Name}");
}
Console.WriteLine();
}

这个输出会将Name为“TUV”的名字输出,但其城市却是空的,原因就是在cities找不到编号为5的City信息。

输出结果如下:

其等价的LINQ语句为:

     var result = from p in persons
join c in cities on p.CityID equals c.ID into cs
select new { PersonName = p.Name, Citys = cs };

六、GroupJoin第二种方法:

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

官方释义:基于键相等对两个序列的元素进行关联并对结果进行分组。使用指定的IEqualityComparer<TKey>对键进行比较。

这个与Join第二种方法类似,这里不再进行讲述。

LINQ之 Join 与 GroupJoin的更多相关文章

  1. [C#] LINQ之Join与GroupJoin

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.编写Person与City类,如下: class Person { public int CityID { set; get; } ...

  2. LINQ标准查询操作符(二)——Join、GroupJoin、GroupBy、Concat、

    四.联接操作符 联接是指将一个数据源对象与另一个数据源对象进行关联或者联合的操作.这两个数据源对象通过一个共同的值或者属性进行关联. LINQ有两个联接操作符:Join和GroupJoin. 1. J ...

  3. [C#]使用Join与GroupJoin将两个集合进行关联与分组

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参 ...

  4. [C#] LINQ之SelectMany和GroupJoin

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. C#中使用Join与GroupJoin将两个集合进行关联与分组

    转自:https://www.cnblogs.com/cncc/p/7985843.html 对于Join的用法说明如下: 语法: public static IEnumerable<TResu ...

  6. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...

  7. LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法

    介绍    ·Select - Select选择:延迟    ·Where - Where查询:延迟    ·OrderBy - 按指定表达式对集合正序排序:延迟    ·OrderByDescend ...

  8. linq group join

    本篇介绍Linq的Group和Join操作,继续使用<Linq 学习(3) 语法结构>中介绍的数据源. GroupGroup是进行分组操作,同SQL中的Group By类似.原型如下: p ...

  9. Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果

    例如,可以将产品表与产品类别表相联接,得到产品名称和与其相对应的类别名称 db.Products .Join ( db.Categories, p => p.CategoryID, c => ...

随机推荐

  1. .net core下使用DbProviderFactories.GetFactory("")无法创建工厂的解决方案

    前言:我们有时候会有一种需求,需要连接很多的数据库,如:mysql,sqlserver,oracle等等,需要把这些数据库里的数据抽取出来加工后,返回给客户端使用. 在.net framework中是 ...

  2. C# QRBarCode

    1. install-package barcode -v 4.0.2.2; 2. using IronBarCode; class Program { static void Main(string ...

  3. ASP.NET Core框架深度学习(二) 管道对象

    4.HttpContext 第一个对象 我们的ASP.NET Core Mini由7个核心对象构建而成.第一个就是大家非常熟悉的HttpContext对象,它可以说是ASP.NET Core应用开发中 ...

  4. Hive_hdfs导入csv文件

    转自:Hive_hdfs csv导入hive demo   1 create csv file.student.csv 4,Rose,M,78,77,76 5,Mike,F,99,98,98 2 pu ...

  5. go-gtk环境配置

    go-gtk环境配置(用于go的图形化界面) 弄了一天,终于把这个环境给搭建好了,差不多就是安装msys2->安装gtk的各个版本->安装mingw(我原来装有但不影响,因为重复了,环境变 ...

  6. 对Python中函数参数类型及排序问题,三个方面的总结

    Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...

  7. SPA项目开发之首页导航+左侧菜单

    Mock.js: 前后端分离之后,前端迫切需要一种机制,不再需要依赖后端接口开发,而mockjs就可以做到这一点 Mock.js是一个模拟数据的生成器,用来帮助前端调试开发.进行前后端的原型分离以及用 ...

  8. CAD制图初学入门教程:怎么在CAD中绘制箭头

    在接触CAD的时候大家有没有和小编一样感觉无所适从,所以下面就来和大家分享一个CAD制图初学入门教程,在CAD中绘制箭头.在CAD图形上进行标注内容的时候一般都会使用箭头来进行指示,那具体怎么在CAD ...

  9. dos编码格式 cmd编码 dos中文显示

    设置uft-8编码 > chcp 65001 设置默认编码 > chcp 936 字符集 1258 越南语 1257 波罗的语 1256 阿拉伯语 1255 希伯来语 1254 土耳其语 ...

  10. swift(五)swift的函数

    /** * 函数的定义和调用 */ func showIntegerArray(array:[Int]) { for a in array { println("\(a)") } ...