当前位置: 首页 > news >正文

Linq 内联左联等

我们在做SQL查询的时候经常会用到Inner Join,Left Join,笛卡尔积等等,连接方式的概念方面我想也不用给予太多解释,

我们今天的重点是让大家熟悉LINQ是如何使用Join来实现常用的表连接的。

创建测试用类:

[csharp]  view plain  copy
 
  1. class Customer  
  2. {  
  3.     public int CustomerId { get; set; }  
  4.   
  5.     public string Name { get; set; }  
  6.   
  7.     public int Age { get; set; }  
  8.   
  9. }  
  10.   
  11. class Product  
  12. {  
  13.     public int ProductId { get; set; }  
  14.   
  15.     public string Name { get; set; }  
  16.   
  17.     public string Origin { get; set; }  
  18.   
  19. }  
  20.   
  21. class Order  
  22. {  
  23.     public int OrderId { get; set; }  
  24.   
  25.     public int CustomerId { get; set; }  
  26.   
  27.     public List<Product> Products { get; set; }  
  28. }  

我们用以下例子来熟悉 Join 关键字的用法。

1.Inner Join:

[csharp]  view plain  copy
 
  1. CreateEntities();  
  2. var query = from c in customers  
  3.             join o in orders on c.CustomerId equals o.CustomerId  
  4.             where o.OrderId == 2  
  5.             select c;  
  6. foreach (var customer in query)  
  7. {  
  8.     Console.WriteLine("Id:{0}, Name:{1}", customer.CustomerId, customer.Name);  
  9. }  

 

运行结果:

  Id:1, Name:CA   

 上面这个是常见的内连接的例子,和SQL语法也很相似,但有以下几点要注意:

(1).连接条件: c.CustomerId equals o.CustomerId 只能使用 equals 不能用 =,==,等于 等表示。
以为LINQ的设计者认为 几乎所有的连接条件都是 = 条件不会出现 >,<,!= 等情况因此使用了个关键字来描述表连接条件。

(2).条件顺序:c.CustomerId equals o.CustomerId ,range variable: c 和b之前的顺序不能颠倒。

 

2.Group Join:

也许大家对Group Join的概念不太了解,没关系让我们通过例子来认识它:

[csharp]  view plain  copy
 
  1. CreateEntities();  
  2. var query = from c in customers  
  3.             join o in orders on c.CustomerId equals o.CustomerId into os  
  4.             select new { c, os };  
  5. foreach (var item in query)  
  6. {  
  7.     Console.WriteLine("Customer Id:{0}, Name:{1}", item.c.CustomerId, item.c.Name);  
  8.     foreach (var o in item.os)  
  9.     {  
  10.         Console.WriteLine("--Order Id:{0}", o.OrderId);  
  11.     }  
  12. }  

结果:

Customer Id:1, Name:CA
--Order Id:1
--Order Id:2
Customer Id:2, Name:CB
--Order Id:4
Customer Id:3, Name:CC
--Order Id:3
Customer Id:4, Name:CD
Press any key to continue . . .

以上查询返回的结果:和Group By 返回的结果非常的相似:一个KEY对象对应一个集合。

要实现Group Join我们要引入一个关键字:into

但使用时要注意一下几点:

(1).使用into 关键字后 join 后面的 range variable:o 在后面的表达式块中就失去了作用域。

(2).range variable:os 通常情况下都是IEnumerable<T>类型的。

 

3.Left Join:

 Left Join 我们在SQL里经常用到,让我们来看看LINQ里怎么实现它:

[csharp]  view plain  copy
 
  1. CreateEntities();  
  2. var query = from c in customers  
  3.             join o in orders on c.CustomerId equals o.CustomerId into os  
  4.             from o2 in os.DefaultIfEmpty(  
  5.                 new Order { OrderId = 0, CustomerId = 0, Products = new List<Product>() })  
  6.             select new { c, o2 };  
  7. foreach (var item in query)  
  8. {  
  9.     Console.WriteLine("Customer Id:{0}, Name:{1}--Order Id:{0}",  
  10.         item.c.CustomerId, item.o2.OrderId);  
  11. }  

结果:

Customer Id:1, Name:1--Order Id:1
Customer Id:1, Name:2--Order Id:1
Customer Id:2, Name:4--Order Id:2
Customer Id:3, Name:3--Order Id:3
Customer Id:4, Name:0--Order Id:4
Press any key to continue . . . 

我们可以看到Left Outer Join 的语法进一步的复杂化了,结果也有细微的不同。

(1).从语法上:

from o2 in os.DefaultIfEmpty(
                new Order { OrderId = 0, CustomerId = 0, Products = new List<Product>() })

主要区别在于以上者1句语句。查询方法DefaultIfEmpty 用于定义当查询记录为空时,预定义默认值。再从其集合中取出子元素。

(2).从结果上: 我们在遍历查询结果时可以发现Left Join相似于Inner Join结果都是“平面”的,然而Group Join返回的结果具有层次性。

 

题外:

由于C#是面向对象的,往往会通过对象与对象间的外系来实现数据间关系。有时表达2个之间的关系也可以不使用Join关键字,

因此Join关键字其实在实际LINQ查询表达式中用的不是很多。

转载于:https://www.cnblogs.com/libaoli/p/5261141.html

相关文章:

  • 初探博客园
  • ActiveMQ消息的可靠性机制(转)
  • 啦啦啦~
  • select 相关
  • JSP具体篇——out
  • 20145109《Java程序设计》第二周学习总结
  • Mac OS X下高速拷贝文件路径
  • Material Design之TextInputLayout使用示例
  • redis配置详情
  • JS 笔记(一)
  • 作业二:四则运算
  • Eclipse使用快捷键代码格式化有时失效解决办法
  • 出差(二十四)失控
  • Qt 在控件上面绘图 label,pushbutton。。。。。
  • 抽象类,继承,接口个人见解
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 30天自制操作系统-2
  • C++类的相互关联
  • CAP 一致性协议及应用解析
  • CSS 提示工具(Tooltip)
  • CSS魔法堂:Absolute Positioning就这个样
  • Docker入门(二) - Dockerfile
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ES6系统学习----从Apollo Client看解构赋值
  • Golang-长连接-状态推送
  • Laravel Mix运行时关于es2015报错解决方案
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux各目录及每个目录的详细介绍
  • Linux链接文件
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • windows下如何用phpstorm同步测试服务器
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 算法之不定期更新(一)(2018-04-12)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 在Mac OS X上安装 Ruby运行环境
  • 1.Ext JS 建立web开发工程
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $GOPATH/go.mod exists but should not goland
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.9) MSP (version 4.2)
  • (5)STL算法之复制
  • (C#)一个最简单的链表类
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ZT)薛涌:谈贫说富
  • (笔试题)分解质因式
  • (补)B+树一些思想
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)编辑寄语:因为爱心,所以美丽
  • .describe() python_Python-Win32com-Excel
  • .net 7 上传文件踩坑
  • .net 调用php,php 调用.net com组件 --