LINQ 基本子句之二 join
Join子句据说可以实现3中连接关系。
1.内部连接——元素的连接关系必须同时满足被连接的两个数据源
2.分组连接
3.左外连接
1.最基本的,内部连接,类似于sql中inner join。
由于student类和phone类只有一个匹配的连接,因此,只返回一个id,1.
public class student
{
public int id;
string name;
public student(int id, string name)
{
this.id = id;
this.name = name;
}
}
public class phone
{
public int id;
string number;
public phone(int i, string number)
{
this.id = i;
this.number = number;
} } class Program
{
static void Main(string[] args)
{
List<student> stu=new List<student>();
List<phone> ph=new List<phone>();
student st1=new student (,"bob");
student st2 = new student(, "tony");
phone p1 = new phone(, "");
stu.Add(st1);
stu.Add(st2);
ph.Add(p1);
var result = from x in ph
join s in stu on x.id equals s.id
select x;
foreach(var r in result)
Console.WriteLine(r.id);
Console.ReadLine();
}
}
2.分组连接 类似于full join
注意其中ToList的用法。我还不很明白,Mark之。
public class student
{
public int id;
public string name;
public student(int id, string name)
{
this.id = id;
this.name = name;
}
}
public class phone
{
public int id;
public string number;
public phone(int i, string number)
{
this.id = i;
this.number = number;
} } class Program
{
static void Main(string[] args)
{
List<student> stu=new List<student>();
List<phone> ph=new List<phone>();
student st1=new student (,"bob");
student st2 = new student(, "tony");
phone p1 = new phone(, "");
stu.Add(st1);
stu.Add(st2);
ph.Add(p1);
var result = from s in stu
join p in ph on s.id equals p.id into g
select new
{
id = s.id,
name = s.name,
phone = g.ToList()
};
foreach (var r in result)
{
Console.WriteLine(r.id);
Console.WriteLine(r.name);
if (r.phone.Count > )
Console.WriteLine(r.phone[].number);
else
Console.WriteLine("xxxx");
}
Console.ReadLine();
}
}
结果如图

3.类似Left join,往往与DefaultIfEmpty()结合使用,若第一个集合中的元素没有找到相关元素,DefaultIfEmpty()可以指定该元素的相关元素的默认元素。
讲phone作为第一个元素
class Program
{
static void Main(string[] args)
{
List<student> stu=new List<student>();
List<phone> ph=new List<phone>();
student st1=new student (,"bob");
student st2 = new student(, "tony");
phone p1 = new phone(, "");
stu.Add(st1);
stu.Add(st2);
ph.Add(p1);
var result = from p in ph
join s in stu on p.id equals s.id into g
from pc in g.DefaultIfEmpty()
select new
{
id = p.id,
num = p.number,
name = g.ToList()
};
foreach (var r in result)
{
Console.WriteLine(r.id);
Console.WriteLine(r.num);
if (r.name.Count > )
Console.WriteLine(r.name[].name);
else
Console.WriteLine("xxxx");
}
Console.ReadLine();
}
结果如图

通常,若要生成两个集合的左外部连接,可以分两步实现,
其一,使用分组连接执行内部连接。
其二,对分组连接中每个匹配元素序列调用DefaultIfEmpty().
LINQ 基本子句之二 join的更多相关文章
- Linq 多表连接查询join
在查询语言中,通常需要使用联接操作.在 LINQ 中,可以通过 join 子句实现联接操作.join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的 ...
- LINQ TO SQL 中的join(转帖)
http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西 ...
- linq总结系列(二)---Expression
一.linq中的表达式和表达式树 Linq中的表达式(Expression<TDel>)是强类型的lambda表达式,对Func和Action形式的委托做了一层封装. lambda表达式的 ...
- LINQ&EF任我行(二)--LinQ to Object
(原创:灰灰虫的家http://hi.baidu.com/grayworm)LinQ to Objects是LinQ家庭的核心,其它的LinQ也使用了与LinQ to Objects相同的查询句法.最 ...
- LINQ to SQL语句之Join和Order By
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...
- LINQ学习笔记(二)
上一篇是根据百度百科写的随便,同时也纠正我对LINQ的看法,因为首次接触LINQ是使用EF对数据库数据的操作. 所以误以为它操作数据库的一种新手段. LINQ语言集成查询是一组技术的名称,这些技术建立 ...
- LINQ基础 之 LINQ TO SQL (二)
配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...
- Using LINQ Group By and String.Join() / Aggregate() in Entity Framework 3.5
linq to sql 的时候,有时候需要用到 先group 然后来个 aggregate 串连一下值, 但会总会出错,说不识别 aggregate 或者 string.join 方法 搜遍网络 一 ...
- LINQ,EF联合查询join
public object GetListAdmin() { //return db_C56.Admins // .Where(a => a.Status != "D") ...
随机推荐
- configure交叉编译
今天在交叉编译时犯了一个错误,纠结了好久,曾经交叉编译器的前缀基本上都是用arm-linux-,这次换了一个新环境是arm-none-linux-gnueabi-,于是想当然的把configure中的 ...
- boost.asio系列——Timer
同步Timer asio中提供的timer名为deadline_timer,它提供了超时计时的功能.首先以一个最简单的同步Timer为例来演示如何使用它. #include<iostream&g ...
- 数组,集合 转成DataTable 方法
public static DataTable ToDataTable(IList p_List) { DataTable _DataTable = new DataTable(); if (p_Li ...
- (转)最小二乘法拟合圆公式推导及vc实现[r]
(下文内容为转载,不过已经不清楚原创的是哪里了,特此说明) 转自: http://www.cnblogs.com/dotLive/archive/2006/10/09/524633.html 该网址下 ...
- Java中的各种o
java的po vo dao dto pojo 1各个术语的简介 PO(persistant object)持久对象 最形象的理解就是一个PO就是数据库中的一条记录.PO是在ORM中出现的概念,就是O ...
- shell练习--用户下载交互检测
#!/bin/bash #By spinestars #-- read -p "请输入下载目录路径" down_dir read -p "请输入网址路径" ur ...
- project euler 19: Counting Sundays
import datetime count = 0 for y in range(1901,2001): for m in range(1,13): if datetime.datetime(y,m, ...
- linux io优化
场景:xml文件解析入库:并备份 问题:磁盘io异常,经常100%busy: linux io优化方法: 1.修改磁盘挂着参数,修改为writeback模式:对于文件读取频繁的可以设置noatime: ...
- Cognitive Radio Emergency Networks – Requirements and Design
2005 IEEE 这是一个典型的Ad hoc场景.紧急情况下的临时自组网络.虽然之前的论文中把它标记为out-of-band global coverage,但这个也是分组的,每个组有个gatewa ...
- log4j 将日志记录到数据库
需要以下jar包: ---log4j commons-loggin-1.1.1.jar log4j-1.2.16.jar ---mysql mysql-connector-java-5.1.15-bi ...