LINQ查询表达式---------join子句

join 子句接受两个源序列作为输入。 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性。 join子句使用特殊的 equals 关键字比较指定的键是否相等。 join 子句执行的所有联接都是同等联接。 join 子句的输出形式取决于所执行的联接的具体类型。 以下是三种最常见的联接类型:

内部联接

分组联接

左外部联接

class Program
{
public class PerInfo
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
} public class CustInfo
{
public int PerId
{
get;
set;
}
public string Tel
{
get;
set;
}
public string Email
{
get;
set;
}
} static void Main(string[] args)
{
List<PerInfo> perinfos = new List<PerInfo>
{
new PerInfo{Id = , Name = "小白", Age = },
new PerInfo{Id = , Name = "小日", Age = },
new PerInfo{Id = , Name = "小月", Age = },
new PerInfo{Id = , Name = "小明", Age = }
}; List<CustInfo> custInfos = new List<CustInfo>
{
new CustInfo{PerId = , Tel = "153******", Email = "123@qq.com"},
new CustInfo{PerId = , Tel = "153****11", Email = "321@qq.com"},
new CustInfo{PerId = , Tel = "134******", Email = "112@qq.com"},
new CustInfo{PerId = , Tel = "134****11", Email = "211@qq.com"},
new CustInfo{PerId = , Tel = "125******", Email = "134@qq.com"},
new CustInfo{PerId = , Tel = "125****11", Email = "431@qq.com"}
}; //1、内部联接
var query1 = from p in perinfos
join c in custInfos on p.Id equals c.PerId
select new { NewName = p.Name, NewTel = c.Tel, NewEmail = c.Email };
Console.WriteLine("内部联接:");
foreach (var item in query1)
{
Console.WriteLine(" {0} {1} {2}", item.NewName, item.NewTel, item.NewEmail);
} //2、分组联接_01
var query2 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select new { NewName = p.Name, NewQuery = groupquery };
Console.WriteLine("\n分组联接_01");
foreach (var v in query2)
{
Console.WriteLine("{0}", v.NewName);
foreach (var item in v.NewQuery)
{
Console.WriteLine(" {0} {1}", item.Tel, item.Email);
}
} //3、分组联接_02
var query3 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select groupquery;
Console.WriteLine("\n分组联接_02");
foreach (var v in query3)
{
foreach (var item in v)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} //4、分组联接_03
var query4 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select new
{
NewName = p.Name,
NewQuery = from q in groupquery
where q.PerId >
orderby q.Email descending
select q
};
Console.WriteLine("\n分组联接_03");
foreach (var v in query4)
{
Console.WriteLine("{0}", v.NewName);
foreach (var item in v.NewQuery)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} //5、左外联接_01
var query5 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
select groupquery.DefaultIfEmpty(new CustInfo()
{
PerId = p.Id, Tel = "Nothing", Email = "Nothing"
});
Console.WriteLine("\n左外联接_01");
foreach (var v in query5)
{
foreach (var item in v)
{
Console.WriteLine(" {0} {1} {2}", item.PerId, item.Tel, item.Email);
}
} // 6、左外联接_02
var query6 = from p in perinfos
join c in custInfos on p.Id equals c.PerId into groupquery
from item in groupquery.DefaultIfEmpty()
select new { Email = item == null ? "Nothing!" : item.Email, ID = p.Id }; Console.WriteLine("\n左外联接_02");
foreach (var v in query6)
{ Console.WriteLine(" {0} {1} ", v.ID, v.Email); } Console.ReadLine();
}
}
输出结果:
内部联接:
小白 153****** 123@qq.com
小白 153****11 321@qq.com
小日 134****** 112@qq.com
小日 134****11 211@qq.com
小明 125****** 134@qq.com
小明 125****11 431@qq.com 分组联接_01
小白
153****** 123@qq.com
153****11 321@qq.com
小日
134****** 112@qq.com
134****11 211@qq.com
小月
小明
125****** 134@qq.com
125****11 431@qq.com 分组联接_02
1 153****** 123@qq.com
1 153****11 321@qq.com
2 134****** 112@qq.com
2 134****11 211@qq.com
4 125****** 134@qq.com
4 125****11 431@qq.com 分组联接_03
小白
小日
2 134****11 211@qq.com
2 134****** 112@qq.com
小月
小明
4 125****11 431@qq.com
4 125****** 134@qq.com 左外联接_01
1 153****** 123@qq.com
1 153****11 321@qq.com
2 134****** 112@qq.com
2 134****11 211@qq.com
3 Nothing Nothing
4 125****** 134@qq.com
4 125****11 431@qq.com 左外联接_02
1 123@qq.com
1 321@qq.com
2 112@qq.com
2 211@qq.com
3 Nothing!
4 134@qq.com
4 431@qq.com

  

LINQ查询表达式---------join子句的更多相关文章

  1. LINQ查询表达式---------select子句

    LINQ查询表达式---------select子句 1.1常见的select子句查询 class Program { public class PerInfo { public int Id { g ...

  2. LINQ查询表达式---------from子句

    LINQ查询表达式---------from子句 LINQ的查询由3基本部分组成:获取数据源,创建查询,执行查询. //1.获取数据源 List<, , , , , }; //创建查询 var ...

  3. LINQ查询表达式---------let子句

    LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class P ...

  4. LINQ查询表达式---------orderby子句

    LINQ查询表达式---------orderby子句 LINQ可以按元素的一个或多个属性对元素进行排序. class Program { public class PerInfo { public ...

  5. LINQ查询表达式---------group子句

    LINQ查询表达式---------group子句 LINQ表达式必须以from子句开头,以select或group子句结束.使用guoup子句来返回元素分组后的结果.group 子句返回一个 IGr ...

  6. LINQ查询表达式---------where子句

    LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...

  7. 2.3 LINQ查询表达式中 使用select子句 指定目标数据

    本篇讲解LINQ查询的三种形式: 查询对象 自定义查询对象某个属性 查询匿名类型结果 [1.查询结果返回集合元素] 在LINQ查询中,select子句和from子句都是必备子句.LINQ查询表达式必须 ...

  8. LINQ查询表达式---------into

    LINQ查询表达式---------into into 上下文关键字创建一个临时标识符,以便将 group.join 或 select 子句的结果存储到新的标识符 class Program { pu ...

  9. LINQ查询表达式(1) - 查询表达式基础

    LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...

随机推荐

  1. 【福利】微信小程序精选Demo合集

    小编最近在开发小程序,也读到了不少优秀的小程序源码,项目中有些需求可以直接从源码里粘贴复制过来,虽然这样做不利于自己独立编写代码,但比较是给公司做项目啊,秉着效率第一的原则,简直没有什么比ctrl+c ...

  2. Git Push问题remote: hooks/update:10 undefined method &#39;require_relative&#39; for main:Object(NomethodError)

    今天在提交代码时遇到到了一个非常蛋疼的问题,remote: hooks/update:10 undefined method 'require_relative' for main:Object(No ...

  3. sql中group by用来干嘛的

    sql中group by用来干嘛的 一.总结 一句话总结: 1.group by用来分类汇总的,by后面接要分的类 2.group by既然是分类汇总,那就要和聚合函数结合使用,因为要汇总啊 3.ha ...

  4. linux服务器集群重复批量操作脚本实现

    http://blog.csdn.net/flyinmind/article/details/8074863  在服务器集群的维护中,经常会遇到同样的操作重复执行很多遍的情况,“登录服务器->做 ...

  5. Java冒泡排序与直接选择排序代码随笔

    冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置...第一趟确定一个最大(最小)值放到前边(后 ...

  6. 原生H5页面模拟APP左侧滑动删除效果

    话不多说,往左侧滑动,显示删除,我们先来看一下效果图:如下: 这个布局我就不多说,反正就是一行ul,li, class名“item” js代码如下: $(".item").on(& ...

  7. s便携小方法,你值得拥有

    引言: 本章没有深奥的讲解js一些底层原理,比如this指针.作用域.原型啦,涉及的都是一些有利于平时开发时简化代码,提高执行效率,或者说可以当做一种经验方法来使用,篇幅都不长,小步快跑的让你阅读完整 ...

  8. Java10 新特性

    Java 10 新特性 这次发布的 Java 10,新带来的特性并不多. 根据官网公开资料,共有 12 个 JEP(JDK Enhancement Proposal 特性加强提议),带来以下加强功能: ...

  9. centos 7 构造iptables开放80port

    centos7默认是使用firewalld托管防火墙. 安装后centos7后,已安装nginxserver,但同样没有在一个局域网访问,我哥哥告诉我,我应该是一个防火墙以打开.防火墙关闭就可以了. ...

  10. 真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)

    一.TCP报文格式 下面是TCP报文格式图: (1) 序号, Seq(Sequence number), 占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2) 确 ...