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. 在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象。你可能没有合适的权限”

    在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象.你可能没有合适的权限” 打开组策略管理其它选项提示:找不到指定路径.之前做过的操作:取消域控主机上的共享目录sysvol和 ...

  2. C#基础学习心得(一)

    类的成员 数据成员:字段,常量(const) 函数成员:方法,属性,索引器,构造函数,析构函数,事件 类的声明 实例成员:对象相关性,不同于同一类的其他实例 静态成员:常量,static修饰的字段,方 ...

  3. overflow清楚浮动 + 去掉li标签的小圆点

    原文链接:http://blog.163.com/qqabc20082006@126/blog/static/22928525201031211212955/ 测试用例: <!DOCTYPE h ...

  4. C#创建文件夹、文件

    private void CheckCatcheDirectory()//创建文件夹      {          if (!Directory.Exists(xmlFilePath))//xmlF ...

  5. UIAlertView与UIActionSheet

    1.UIAlertView(警告框) 1.1 创建警告框,设置样式 - (IBAction)alertView:(UIButton *)sender {//创建button按钮 //创建警告框的实例 ...

  6. size_t和size_type类型

    size_t一般用来表示一种计数,比如有多少东西被拷贝等.例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小. 它的意义大致是“适于计量内存中可容纳的数据 ...

  7. Android方法的传递值及其改变

    MainActivity如下: package cn.testchangevar; import android.os.Bundle; import android.view.View; import ...

  8. FastJSON 简单使用

    FastJSON是一个Java语言编写的高性能,功能完善,完全支持http://json.org的标准的JSON库.多了不说了,百度一下一大把. 在此,简单的总结一下自己用过,测试过的方法. 如果使用 ...

  9. HTML5学习笔记一:新增主体结构元素

    Dreamweaver快捷键: 属性面板:Ctrl+F3 新建文档:Ctrl+N 选择用网页查看:F12 新增的主体结构元素: section元素(例子如下): <!DOCTYPE HTML&g ...

  10. __m128i的理解[转]

    __m128i被称为128bits的整数,当我们对其赋值时,调用 __m128i _mm_set1_epi32(int i) Sets the four signed 32-bit integer v ...