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. VVDocumenter-Xcode

      从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性.因此Xcode版本更新之后需要在VVDocumenter-Xcode的Info.plist文件中添加Xcode的UUID. 步骤 ...

  2. OpenJudge计算概论-数字求和

    /*========================================================= 数字求和 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个 ...

  3. gis空间分析案例教程-下篇预告

    1. 三维空间坐标转换,地理处理工具 2. 3参数,7参数计算,地理处理工具 3. 3参数,7参数坐标转换,地理处理工具 4. 坐标转换工具箱:集成高斯投影,参数计算,坐标转换所有功能. 作业:GIS ...

  4. vue项目中 favicon.ico不能正确显示的问题

    方法一:修改index.html文件 <link rel="shortcut icon" type="image/x-icon" href="f ...

  5. NetHogs监控Linux的每个进程流量

    在日常运维环境中,我们肯定会遇到以下这种需求: 1.网络流量异常,不知道是哪个程序的流量爆涨? 2.日常需要监控网络实时的流量进去数据 面试装逼系列|这篇文章,让运维监控不再成为你的短板! 学会这 1 ...

  6. Qt编写自定义控件52-颜色下拉框

    一.前言 这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标签设置,这个控件的难度系数接近 ...

  7. css简单学习属性3---css属性选择器

    1:通配符 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. Mysql读写分离(Mycat版)

    (1).读写分离概述 1)工作原理 读写分离是让主数据库处理事务性增删改操作(insert.delete.update),让从数据库处理查询查询操作(select). 2)作用 1.分担负载 2.主从 ...

  9. Intellij-编码设置

    目录 文件编码修改 @(目录) 文件编码修改 • 上图标注 1 所示,IDE 的编码默认是 UTF-8 , Project Encoding 虽然默认是 GBK ,但是一般都建议 修改为 UTF-8 ...

  10. 第一个php文件运行

    运行会发现报错,解决参考:写的很详细 http://blog.csdn.net/meegomeego/article/details/36020553