一、JOIN的作用

1、使用联接来结合两个或更多的集合的数据。

2、联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段。

Note:这里是包含而不是这个原实集合的字段一定要使用,这要看SELECT原始集合的哪些字段。

二、LINQ表达式的语法

Jion Identifier in Collection2 On Field1 equals Field2

     Note:使用上下文关键字“equals”来比较字段,不能用“==”这个运算符

示例:Student.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LINQDemoWinForm
{
class Student
{
public int ID { get;set;}
public string SName { get; set; }
public int Age { get; set; }
}
}

Product.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LINQDemoWinForm
{
class Product
{
public int ID { get; set; }
public string PName { get; set; }
public double Price { get; set; }
}
}

LINQ语句

 private void button1_Click(object sender, EventArgs e)
{
//初始化Student数组
Student[] arrStu = new Student[]{
new Student{ID=,SName="zhangsan",Age=},
new Student{ID=,SName="lisi",Age=},
new Student{ID=,SName="wangwu",Age=},
new Student{ID=,SName="liuliu",Age=},
};
//初始化Product数组
Product[] arrPro = new Product[]{
new Product{ID=,PName="Apple",Price=2.25},
new Product{ID=,PName="Orange",Price=5.25},
new Product{ID=,PName="Banana",Price=7.5},
new Product{ID=,PName="StrawBerry",Price=6.5},
};
//LINQ语句
var query = from sItem in arrStu
join pItem in arrPro
on sItem.ID equals pItem.ID
select new { sItem.SName, sItem.Age, pItem.PName, pItem.Price };//Select后面接一个匿名对象
StringBuilder sbRes = new StringBuilder(); //打印
foreach (var item in query)
{
sbRes.AppendFormat("SName:{0},Age:{1},PName:{2},Price:{3}", item.SName, item.Age, item.PName, item.Price);
sbRes.AppendLine();
}
MessageBox.Show(sbRes.ToString());
}

执行结果:

三、标准查询运算符—Join

原函数:

  //
// 摘要:
// 基于匹配键对两个序列的元素进行关联。 使用默认的相等比较器对键进行比较。
//
// 参数:
// outer:
// 要联接的第一个序列。
//
// inner:
// 要与第一个序列联接的序列。
//
// outerKeySelector:
// 用于从第一个序列的每个元素提取联接键的函数。
//
// innerKeySelector:
// 用于从第二个序列的每个元素提取联接键的函数。
//
// resultSelector:
// 用于从两个匹配元素创建结果元素的函数。
//
// 类型参数:
// TOuter:
// 第一个序列中的元素的类型。
//
// TInner:
// 第二个序列中的元素的类型。
//
// TKey:
// 键选择器函数返回的键的类型。
//
// TResult:
// 结果元素的类型。
//
// 返回结果:
// 一个具有 TResult 类型元素的 System.Collections.Generic.IEnumerable<T>,这些元素是通过对两个序列执行内部联接得来的。
//
// 异常:
// System.ArgumentNullException:
// outer 或 inner 或 outerKeySelector 或 innerKeySelector 或 resultSelector 为 null。
public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector);

Note:这是一个泛型的扩展方法。outerKeySelector,innerKeySelector这两个参数是两个集合需要比较的键。resultSelector相当于前面的Selcet,后面可以接一个匿名对象。

示例:

使用到前面的Student,Product类,运行结果和前面一样。

 private void button1_Click_1(object sender, EventArgs e)
{
//初始化Student数组
Student[] arrStu = new Student[]{
new Student{ID=,SName="zhangsan",Age=},
new Student{ID=,SName="lisi",Age=},
new Student{ID=,SName="wangwu",Age=},
new Student{ID=,SName="liuliu",Age=},
};
//初始化Product数组
Product[] arrPro = new Product[]{
new Product{ID=,PName="Apple",Price=2.25},
new Product{ID=,PName="Orange",Price=5.25},
new Product{ID=,PName="Banana",Price=7.5},
new Product{ID=,PName="StrawBerry",Price=6.5},
};
//标准查询运算符
var query = arrStu.Join(arrPro, s => s.ID, p => p.ID, (s, p) =>new { s.SName, s.Age, p.PName, p.Price });
StringBuilder sbRes = new StringBuilder();
//打印
foreach (var item in query)
{
sbRes.AppendFormat("SName:{0},Age:{1},PName:{2},Price:{3}", item.SName, item.Age, item.PName, item.Price);
sbRes.AppendLine();
}
MessageBox.Show(sbRes.ToString());
}

LINQ学习——JOIN的更多相关文章

  1. linq group join

    本篇介绍Linq的Group和Join操作,继续使用<Linq 学习(3) 语法结构>中介绍的数据源. GroupGroup是进行分组操作,同SQL中的Group By类似.原型如下: p ...

  2. (转)Linq学习笔记

    写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...

  3. C#之Linq学习笔记【转】

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  4. Linq学习以及简单用法

    Linq学习 Linq(language Intergrated Query)即语言集成查询 LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询.用于保存和检索来自不同数据源的数据, ...

  5. Linq学习工具及Lamada表达式

    好东西.转载一个.以备学习 Linq学习工具:     http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...

  6. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  7. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...

  8. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  9. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

随机推荐

  1. 利用procedure批量插入数据

    正文   要求在页面查询到5000条数据,为了方便插入,准备用shell脚本写curl命令调用自己写的代码接口,但是速度慢,而且写的时候遇到点儿小问题,故用sql语句写了这个功能   由于operat ...

  2. 常用的js代码片段

    1.单选框/手风琴 <script> $(document).ready(function(){ $("dd").on("click",functi ...

  3. IntelliJ IDEA使用JUnit单元测试

    转载:https://www.cnblogs.com/huaxingtianxia/p/5563111.html 前言 单元测试的基本使用 一.环境配置 使用idea IDE 进行单元测试,首先需要安 ...

  4. Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  5. AlexNet网络

    AlexNet 中包含了比较新的技术点,首次在CNN中成功应用了 ReLu .Dropout和LRN等Trick. 1.成功使用了Relu作为CNN的激活函数,并验证其效果在较深的网络中超过了Sigm ...

  6. 网关服务自定义路由规则(springcloud+nacos)

    1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...

  7. leetcode 刷500道题,笔试/面试稳过吗?谈一谈这些年来算法的学习

    想要学习算法.应付笔试或者应付面试手撕算法题,相信大部分人都会去刷 Leetcode,有读者问?如果我在 leetcode 坚持刷它个 500 道题,以后笔试/面试稳吗? 这里我说下我的个人看法,我认 ...

  8. vue 自定义侧边栏 递归无限子级菜单

    有很多网站会涉及到导航栏,我自己在开发中用的是element导航组件,并且自定义事件,给大家分享一下. 1.使用递归方法,无限循环子级菜单. 2.使用组件封装,维护方便. 3.使用index作为路由跳 ...

  9. 认证授权-学习笔记1-OAuth 2.0

    简介 客户端必须得到用户的授权(authorization grant),才能获得令牌(access token).OAuth 2.0定义了四种授权方式. 授权码模式(authorization co ...

  10. 获取gps信息

    (一)plist修改 添加如下变量 (二)新建视图用来启动Gps 此视图控制器继承CLLocationManagerDelegate #import <UIKit/UIKit.h> #im ...