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的更多相关文章

  1. Linq 多表连接查询join

    在查询语言中,通常需要使用联接操作.在 LINQ 中,可以通过 join 子句实现联接操作.join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的 ...

  2. LINQ TO SQL 中的join(转帖)

    http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西 ...

  3. linq总结系列(二)---Expression

    一.linq中的表达式和表达式树 Linq中的表达式(Expression<TDel>)是强类型的lambda表达式,对Func和Action形式的委托做了一层封装. lambda表达式的 ...

  4. LINQ&EF任我行(二)--LinQ to Object

    (原创:灰灰虫的家http://hi.baidu.com/grayworm)LinQ to Objects是LinQ家庭的核心,其它的LinQ也使用了与LinQ to Objects相同的查询句法.最 ...

  5. LINQ to SQL语句之Join和Order By

    Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...

  6. LINQ学习笔记(二)

    上一篇是根据百度百科写的随便,同时也纠正我对LINQ的看法,因为首次接触LINQ是使用EF对数据库数据的操作. 所以误以为它操作数据库的一种新手段. LINQ语言集成查询是一组技术的名称,这些技术建立 ...

  7. LINQ基础 之 LINQ TO SQL (二)

    配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...

  8. Using LINQ Group By and String.Join() / Aggregate() in Entity Framework 3.5

    linq to sql 的时候,有时候需要用到 先group  然后来个 aggregate 串连一下值, 但会总会出错,说不识别 aggregate 或者 string.join 方法 搜遍网络 一 ...

  9. LINQ,EF联合查询join

    public object GetListAdmin() { //return db_C56.Admins //   .Where(a => a.Status != "D") ...

随机推荐

  1. MongoDB学习笔记04

    创建索引使用ensureIndex方法,对于同一个集合,同样的索引只需要创建一次,反复创建是徒劳的. 对某个键的索引会加速对该键的查询,然而,对于其它查询可能没有帮助,即便是查询中包含了被索引的键.实 ...

  2. JS判断RadioButtonList是否有选中项

    提交表单之前对RadioButtonList控件的选中项进行判断: 方法一: <script type="text/javascript"> function chec ...

  3. select选项改变时获取选中的option的值

    本来天真的以为直接this.value()就能去到select的值,可事实并非那么回事. <script> document.getElementById('select').onchan ...

  4. n个数的最大公约、最小公倍数

    #include <cstdio> #include <cstring> using namespace std; #define N 1010 //两个数的最大公约数和最小公 ...

  5. 解决MySQL中文乱码的问题

    遇到中文乱码问题,首先用status命令检查数据库的配置,如下: 上图会显示数据库配置的各项信息. 还可以用 show create database XXX,来显示创建数据库的时候的编码设置. 一般 ...

  6. USE_DB_RECOVERY_FILE_DEST的使用详解(转载)

    实施时间2009-9-22晚10点 实施工作 1.  数据库归档模式修改: eashost:root:[/] smitty hacmp orahost:root:[/oracle/arch_log]# ...

  7. SqlServer排序(null值,和非空值排列顺序)

    项目中遇到一个问题,需要设置序号排序,而该字段中的默认值为空,使用普通排序,空值就会在最前边.可以使用如下语句:   其中 col 为 排序的字段名称. then 0 else 1 代表先空值,后数字 ...

  8. java类中的static成员变量和static方法简单介绍,持续补充

    一.静态成员变量 1.属于整个类而不是某个对象实例,所以可以直接通过类名和对象名去调用. 2.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收 二.静态方 ...

  9. jquery.fn.extend与jquery.extend(转)

    jQuery为开发插件提拱了两个方法,分别是: JavaScript代码 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend( ...

  10. git diff 使用

    1. 本地工作目录与远程仓库对比(所有改动过的文件) git diff HEAD  (HEAD指向最新一次的提交,即最新版本) 2. 之对比给定的文件 git diff -- filename //是 ...