1.准备数据源,我这边定义了一个实体,里面包含ID,Name,State

 public class NameModel{public int Id { get; set; }public string Name { get; set; }public string State { get; set; }}

List<NameModel> leftName = new List<NameModel>(){new NameModel() {Id=1,Name="我是1",State="4" },new NameModel() {Id=2,Name="我是2",State="4" },new NameModel() {Id=3,Name="我是3",State="4" },new NameModel() {Id=4,Name="我是4",State="4" },new NameModel() {Id=0,Name="我是新人",State="4" },new NameModel() {Id=0,Name="我是新人",State="4" }};List<NameModel> rigthName = new List<NameModel>(){new NameModel() {Id=1,Name="我是r1",State="4" },new NameModel() {Id=5,Name="我是R5",State="4" },new NameModel() {Id=3,Name="我是R3",State="4" },new NameModel() {Id=7,Name="我是R7",State="4" }};

2.我们来看看将2个集合通过Linq 来个内连接,这边通过2种方式来实现:

var list = from left in leftNamejoin rigth in rigthName on left.Id equals rigth.Idselect new{LeftID = left.Id,LeftName = left.Name,RigthID = rigth.Id,RigthName = rigth.Name};foreach (var l in list){Console.WriteLine(l.LeftID + "\t\t" +l.LeftName + "\t\t" +l.RigthID + "\t\t" +l.RigthName + "\t\t");}Console.ReadKey();

var list = leftName.Join(rigthName, p => p.Id, x => x.Id, (p, x) => new{LeftID = p.Id,LeftName = p.Name,RigthID = x.Id,RigthName = x.Name});foreach (var l in list){Console.WriteLine(l.LeftID + "\t\t" +l.LeftName + "\t\t" +l.RigthID + "\t\t" +l.RigthName + "\t\t");}Console.ReadKey();

二次运行的结果是一样的,如图

大家都知道链接包含内连和外连,外连又包含了左右连接,那么我们如何通过Linq来实现左右连接呢?这边就需要我们自己去写扩展方法来实现:

这边需要去定义扩展方法:

public static class JoinExtensions{/// <summary>/// 左连接/// </summary>/// <typeparam name="TSource"></typeparam>/// <typeparam name="TInner"></typeparam>/// <typeparam name="TKey"></typeparam>/// <typeparam name="TResult"></typeparam>/// <param name="source"></param>/// <param name="inner"></param>/// <param name="pk"></param>/// <param name="fk"></param>/// <param name="result"></param>/// <returns></returns>public static IEnumerable<TResult> LeftJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,IEnumerable<TInner> inner,Func<TSource, TKey> pk,Func<TInner, TKey> fk,Func<TSource, TInner, TResult> result){IEnumerable<TResult> _result = Enumerable.Empty<TResult>();_result = from s in sourcejoin i in inneron pk(s) equals fk(i) into joinDatafrom left in joinData.DefaultIfEmpty()select result(s, left);return _result;}/// <summary>/// 右连接/// </summary>/// <typeparam name="TSource"></typeparam>/// <typeparam name="TInner"></typeparam>/// <typeparam name="TKey"></typeparam>/// <typeparam name="TResult"></typeparam>/// <param name="source"></param>/// <param name="inner"></param>/// <param name="pk"></param>/// <param name="fk"></param>/// <param name="result"></param>/// <returns></returns>public static IEnumerable<TResult> RightJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,IEnumerable<TInner> inner,Func<TSource, TKey> pk,Func<TInner, TKey> fk,Func<TSource, TInner, TResult> result){IEnumerable<TResult> _result = Enumerable.Empty<TResult>();_result = from i in innerjoin s in sourceon fk(i) equals pk(s) into joinDatafrom right in joinData.DefaultIfEmpty()select result(right, i);return _result;}/// <summary>/// 合并/// </summary>/// <typeparam name="TSource"></typeparam>/// <typeparam name="TInner"></typeparam>/// <typeparam name="TKey"></typeparam>/// <typeparam name="TResult"></typeparam>/// <param name="source"></param>/// <param name="inner"></param>/// <param name="pk"></param>/// <param name="fk"></param>/// <param name="result"></param>/// <returns></returns>public static IEnumerable<TResult> FullOuterJoinJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source,IEnumerable<TInner> inner,Func<TSource, TKey> pk,Func<TInner, TKey> fk,Func<TSource, TInner, TResult> result){var left = source.LeftJoin(inner, pk, fk, result).ToList();var right = source.RightJoin(inner, pk, fk, result).ToList();return left.Union(right);}}

下面我们就实现下左链接:

var list = leftName.LeftJoin(rigthName, p => p.Id, x => x.Id, (p, x) => new{LeftID = p.Id,LeftName = p.Name,RigthID = x == null ? 0 : x.Id,RigthName = x == null ? "" : x.Name});foreach (var l in list){Console.WriteLine(l.LeftID + "\t\t" +l.LeftName + "\t\t" +l.RigthID + "\t\t" +l.RigthName + "\t\t");}Console.ReadKey();

转载于:https://www.cnblogs.com/tjha/p/6650652.html

Linq Join相关推荐

  1. C# linq join

    linq join 1.inner join 2.left outer join 3.left outer join 4.cross join var innerjoin = (from a in d ...

  2. C# -join 子句(C# 参考)

    join 子句(C# 参考) 2015/07/20 适用于 Visual Studio 的兼容数据库系统 使用复合键进行联接 对 Join 子句的结果进行排序 执行分组联接 执行内部联接 执行左外部联 ...

  3. 一步步学习EF Core(2.事务与日志)

    前言 上节我们留了一个问题,为什么EF Core中,我们加载班级,数据并不会出来 其实答案很简单,~ 因为在EF Core1.1.2 中我们在EF6.0+中用到的的延迟加载功能并没有被加入,不过在EF ...

  4. Module-Zero之组织单元(OU)管理【新增】

    概览介绍 OrganizationUnit实体 OrganizationUnit管理者 公共用例 设置 概览介绍 组织单元(Organization Unit[简称OU])可以有层次地给用户和实体分组 ...

  5. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  6. LINQ to SQL语句(4)之Join

    LINQ to SQL语句(4)之Join Join操作符 适用场景:在我们表关系中有一对一关系,一对多关系, 多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中, ...

  7. Linq中使用Left Join 和 Right Join

    原文地址:http://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html 准备一些测试数据,如下: use Test Create tab ...

  8. Linq 多表连接查询join

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

  9. linq之join子句

    前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句.join子句也是相对比较复杂的,所以最后来讲.join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联 ...

最新文章

  1. UIPickerView 修改必须滚动才修改值的bug
  2. C++程序的执行过程
  3. 利用mysql的预编译机制_SQL注入笔记记录+MySQL的事务隔离级别
  4. LAMP和LNMP去除index.php访问
  5. Android实例RSS客户端开发(2)--解析XML文件
  6. 打开editor的接口讨论
  7. 为什么设计师应该学习编写代码
  8. BugkuCTF-Reverse题Easy_vb多方法解决
  9. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)
  10. java小数丢失精度_Java中的小数运算与精度损失
  11. android 定时唤醒蓝牙,Android保活——蓝牙唤醒(主动kill掉也可唤醒)
  12. tkinter GUI 客户端页面编程 登录注册案例开发
  13. Linux 配置双网卡,同时访问内外网
  14. html手写笔记照片,Myscript Nebo – 好用到哭的手写笔记软件!你只管写画,它帮你识别转换成文字 | 火星博客...
  15. 解决mosh: Nothing received from server on UDP port 60001 环境: centos7.1
  16. erp系统软件php,SMALL-ERP 一个用PHP写的小型ERP系统,麻雀虽小,五脏俱全。 ERP-EIP-OA-Portal 企业管理 271万源代码下载- www.pudn.com...
  17. 如何解决“Cannot be opened because the developer cannot be verified”
  18. 2021年 第一个月的福利 程序员免费资源!
  19. SpringBoot - 集成Swagger、Knif4j接口文档以及文档添加账号密码登录
  20. python中计时工具timeit模块的基本用法

热门文章

  1. python从入门到实践答案第四章_《python从入门到实践》--第四章基本操作列表 重点及课后练习...
  2. 给定一个数组和一个数M,在数组中求一些数使它们的和最接近M------递归
  3. 反转 鼠标_灵动轻巧也有好体验,电竞鼠标不能仅看“块头”
  4. SDP 软件定义边界
  5. java中常见的数据结构分类
  6. Android图表引擎AChartEngine - 简介
  7. MFC 教程【12_对话框和对话框类CDialog 】
  8. MFC 教程【7_MFC的DLL 】
  9. date类型_Chapter 01. 常见数据类型概述 Overview of Common Data Types
  10. 行列式算法c语言,新手作品:行列式计算C语言版