using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Person
{
public int CityID { set; get; }
public string Name { set; get; }
} class City
{
public int ID { set; get; }
public string CityName { set; get; }
} public class Program
{
public static void Main(string[] args)
{
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 = , CityName = "Guangzhou"},
new City {ID = , CityName = "Shenzhen"},
new City {ID = , CityName = "Beijing"},
new City {ID = , CityName = "Shanghai"}
}; //例子1:内联
var result0 = from p in persons
join c in cities
on p.CityID equals c.ID
select new {PersonName = p.Name, Citys = c.CityName};
Console.Write("-----inner join linq--------");
Console.WriteLine();
foreach (var item in result0)
{
Console.Write(item.PersonName);
Console.Write(":");
Console.Write(item.Citys);
Console.WriteLine();
} Console.WriteLine(); //例子2:左联 linq ,这里使用了into,如果cities在persons没有匹配的项,则返回Citys是null,返回的Citys是list
var result01 = from p in persons
join c in cities on p.CityID equals c.ID into cs
select new { PersonName = p.Name, Citys = cs };
Console.Write("------left join linq list-------");
Console.WriteLine();
foreach (var item in result01)
{
Console.Write(item.PersonName);
Console.Write(":");
foreach (var city in item.Citys)
{
Console.Write(city.CityName);
}
Console.WriteLine();
} //例子3:左联 linq,这里使用了into,并且多了from t2 in cs.DefaultIfEmpty(),
//然后在返回的时候Citys进行了为null判断,不然result是没有内容的
var result = from p in persons
join c in cities
on p.CityID equals c.ID into cs
from t2 in cs.DefaultIfEmpty()
select new {PersonName = p.Name, Citys = t2 == null ? "" : t2.CityName};
Console.Write("------left join linq-------");
Console.WriteLine();
foreach (var item in result)
{
Console.Write(item.PersonName);
Console.Write(":");
Console.Write(item.Citys);
Console.WriteLine();
} Console.WriteLine(); //例子4(和例子2是同样的效果):左连 lamda 返回的Citys是list
var result2 = persons.GroupJoin(cities, p => p.CityID, c => c.ID,
(p, cs) => new {PersonName = p.Name, Citys = cs});
Console.Write("------left join lamda GroupJoin list-------");
Console.WriteLine();
foreach (var item in result2)
{
Console.Write(item.PersonName);
Console.Write(":");
foreach (var city in item.Citys)
{
Console.Write(city.CityName);
}
Console.WriteLine();
} Console.WriteLine(); //例子5(和例子3是同样的效果):左连 lamda
var result3 = persons.GroupJoin(cities, p => p.CityID, c => c.ID, (p, cs) => new {p, cs})
.SelectMany(p2 => p2.cs.DefaultIfEmpty(),
(p2, s2) => new {PersonName = p2.p.Name, Citys = s2 == null ? "" : s2.CityName});
Console.Write("------left join lamda GroupJoin DefaultIfEmpty--2-----");
Console.WriteLine();
foreach (var item in result3)
{
Console.Write(item.PersonName);
Console.Write(":");
Console.Write(item.Citys);
Console.WriteLine();
} Console.WriteLine();
Console.ReadKey();
}
}
}

[C#] LINQ之SelectMany和GroupJoin的更多相关文章

  1. [C#] LINQ之Join与GroupJoin

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

  2. [C#] LINQ之SelectMany

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.第一种用法: public static IEnumerable<TResult> SelectMany<TSo ...

  3. LINQ 之 SelectMany

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.第一种用法: public static IEnumerable<TResult> SelectMany<TSo ...

  4. LINQ之 Join 与 GroupJoin

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

  5. Linq入门

    一.Linq需要的C#语法支持: 1.隐式变量的使用var var使用时必须初始化      var是强类型数据 2.自动属性:public string FirstName{get ;set;} 3 ...

  6. LINQ学习笔记 Join 与 Group join

    LINQ中的Join对应T-SQL中的内连接,并无左连接的方法,当然也没有右连接. 要达成Left join必须依靠GroupJoin来完成. GroupJoin顾名思义就是先集团在做加入,加入的不同 ...

  7. 记一次使用 SelectMany 的经历

    最近在改造一个功能时为了减少循环的层数,于是想着将List列表映射为一个能直接使用颗粒大小的List列表,这样一层循环就可以解决问题.     public class ConflictWordIte ...

  8. Entity Framework 与 面向对象

    说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...

  9. 并发编程概述--C#并发编程经典实例

    优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版.NET 中的程序库和语 ...

随机推荐

  1. python -- 安装 django

    django-admin startproject 创建的文件名python3/python manage.py startapp 子项目名称python3/python manage.py runs ...

  2. Framework7 + Angular 开发问题解决汇总

    本篇主要汇总一下使用Framework7 + Angular 开发中遇到的一些难点及我的解决方法,以后再遇到会在这里继续更新. 一.页面表格按需加载 情况描述:默认加载10条,在用户上拉页面是再进行下 ...

  3. gis空间分析案例_7参数单坐标转换

    gis空间分析案例_7参数单坐标转换 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 功能: 对输入的单个坐标,利用7参数,一步进行坐标变换,使用极为直观,极大 ...

  4. vue---vue2.x自定义plugin,给vue添加全局方法,原型上增加全局方法

    1. 自定义plugin.js export default{ install(Vue,options); { Vue.prototype.toStringTwo=(str)=>( ('0000 ...

  5. CentOS 端口和防火墙操作

    Centos 7 端口和防火墙命令: 查看已经开放的端口:firewall-cmd --list-ports 开启端口:firewall-cmd --zone=public --add-port=80 ...

  6. PHP重建数组的索引

    sort() array_merge()跟一个空数组合并都可以重建索引数组的键(key)

  7. jQuery BlockUI Plugin Demo 2

    Overview The jQuery BlockUI Plugin lets you simulate synchronous behavior when using AJAX, without l ...

  8. 共享文件word / excel /ppt 被用戶自己锁定无法编辑-解決方法

    共享文件word / excel /ppt 被用戶自己鎖定無法編輯,但用戶嘗試過關閉所有文件和重啓過系統,依然無法編輯. 搜到解決方法: Just in case someone looking fo ...

  9. go timer定时器 WaitGroup用法

    参考文章: timer定时器: https://www.cnblogs.com/oxspirt/p/7107312.html WaitGroup用法: https://studygolang.com/ ...

  10. netcore mvc菜单,角色,权限

    netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源 AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建 ...