ALinq 入门学习(六)--Join 连接查询

简单介绍一下连接查询:通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。from join_table1 join_type join_table2 on Join_condition  这个是SQL 中最简单的连接查询功能语法。在ALinq , Linq ,Entity Framework 中都有涉及到连接查询,在某种程度上的确简便了很多查询。但是个人认为,Linq to SQL ,ALinq 使用Linq 语句来连接查询数据库不是那么的方便,总感觉有些地方不是Linq 语句所能处理的。本文章出略的讲解ALinq 中连接查询数据。

 

1. 一对多查询

在ORM映射框架中我们听得最多的也就是什么 1 to 1, 1 to many ,many to many 等等。这代表着一种数据结构之间的关系。一对多查询也就是查询主表的时候附带查询子表中的集合信息。在很多情况下不建议采用一对多查询,因为这样是比较消耗性能的。ALinq 一对多查询例子如下:

ALinq 一对多查询

 1 /// <summary>
 2         /// 一对多链接查询
 3         /// </summary>
 4         public void FunctionOnToMany()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 7             context.Log = Console.Out;
 8 
 9             var query = from r in context.TabRole
10                         from u in r.TabUser
11                         where r.Id == 1
12                         select u;
13 
14             foreach (var item in query)
15             {
16                 Console.WriteLine("TabRole.Id >> " + item.TabRole.Id);
17                 Console.WriteLine("TabUser.Id >> " + item.Id);
18                 Console.WriteLine("\n");
19             }
20         }

 

TabUser 作为TabRole 的子表,这段语句会查询出TabRole 的id==1 的所有TabUser 数据集合。也就是说我们查询一个TabRle 的对象同时还可以附带查询出TabUser 的数据集合

 

2.多对多查询

多对多查询一般都会涉及到三张表,一种有一张中间表,适用于连接另外两张表之间的关系的,而这两张表式没有必然联系的。此三张表成

1:N:1 的关系,其中N为中间表,负责维护1和1之间的关系。多对多关系式数据关系表中比较复杂的关系。典型的例子就是我们涉及权限操作的时候。这里不过多讲解。 

ALinq 多对多查询

 1 /// <summary>
 2         /// 多对多查询
 3         /// </summary>
 4         public void FunctionManyToMany()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 7             context.Log = Console.Out;
 8 
 9             var query = from u in context.TabUser
10                         from r in u.TabRule
11                         where u.Id == 1
12                         select new
13                         {
14                             u.Id,
15                             u.UserName,
16                             r.TabMenu
17                         };
18             foreach (var item in query)
19             {
20                 Console.WriteLine("TabUser.ID ==> " + item.Id);
21                 Console.WriteLine("TabUser.UserName ==> " + item.UserName);
22                 Console.WriteLine("TabMenu.ID ==> " + item.TabMenu.Id);
23                 Console.WriteLine("TabMenu.MenuName ==> " + item.TabMenu.MenuName);
24                 Console.WriteLine("");
25             }
26         }

 

 

3. 自连接查询

在连接查询中有一种特殊的连接查询,也就是自连接查询。此种查询,就是自己连接自己进行连接查询。在ALinq 中,自连接查询 使用到两个同类型的对象,来比较某列值之间的查询。下来的例子是查询菜单编号(MenuID) 相同的数据。

ALinq 自连接查询

 1 /// <summary>
 2         /// 自连接查询
 3         /// </summary>
 4         public void FunctionJionSelf()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 7             context.Log = Console.Out;
 8             var query = from r1 in context.TabRule
 9                         from r2 in context.TabRule
10                         where r1.MenuID == r2.MenuID
11                         select new
12                         {
13                             RuleID = r1.Id,
14                             MenuID = r1.MenuID
15                         };
16             foreach (var item in query)
17             {
18                 Console.WriteLine("RuleID ==> " + item.RuleID);
19                 Console.WriteLine("MenuID ==> " + item.MenuID);
20                 Console.WriteLine();
21             }
22         }
23 

 

 

4.双向连接查询

说实话写到这个例子的时候才感觉这才像连接查询语句,所谓的双向链接,只是说在查看的角度不同。1 to many 查询关系,站在对方的角度也就是 many to 1, 双向连接也就是总体上查看他们之间的关系。也就是在查询的时候,主表加载子表的集合,子表加载主表的对象。

ALinq 双向连接查询

 1 /// <summary>
 2         /// 双向连接查询
 3         /// </summary>
 4         public void FunctionJionDouble()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString));
 7             context.Log = Console.Out;
 8             var query = from r in context.TabRole
 9                         join u in context.TabUser
10                         on r.Id equals u.RoleId into userlist
11                         select new
12                         {
13                             r.RoleName,
14                             userlist
15                         };
16             foreach (var item in query)
17             {
18                 Console.WriteLine("RoleName ==> "+item.RoleName);
19                 foreach (var user in item.userlist)
20                 {
21                     Console.WriteLine("UserName ==> "+user.UserName);
22                 }
23                 Console.WriteLine();
24             }
25         }

 

 

 

补充介绍连接查询:

在SQL中连接查询分为三种情况:内连接、外连接和交叉连接

1.内连接

内连接又非为三种情况:等值连接、自然连接和不等连接

等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列

不等连接:在连接条件中使用 除 等于号之外的运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列

自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。这个与等值连接的区别就是重复列的问题。

 

2.外连接

外连接又分为: 左外连接,右外连接,全连接

  左外连接,右外连接:返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)所有数行 。

全连接: 其实就是上面的组合情况,包含两张表中的所有数据。 

 

3.交叉连接 

交叉连接:不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数 

 

上面的链接查询,都只是包含了很肤浅的介绍,文章主要目的还是介绍ALinq中Join关键字的一些简单用法。数据库的链接查询还必须查看具体的SQL官方资料。在使用Linq 语句的时候,我也不太喜欢这种方式的链接查询,感觉SQL语句的连接查询比Linq 语句的连接语句来的更为直接。 

时间: 2024-10-25 12:25:10

ALinq 入门学习(六)--Join 连接查询的相关文章

ALinq 入门学习(七)--OrderBy 排序查询

好些天没有写文章了,博客园也发生了很多变化.最近园子里面火药味越来越浓了.有时候看着想过去发表一下自己的观点,仔细想想还是算了,我不想被卷入这个漩涡中.还是老老实实写自己的文章,记录一下自己所学的东西,学习别人的程序的思考方式,分享一下自己的学习经验.不过这里还是希望博客园中的同仁们,共同的维护好这里的学习氛围,彼此共勉,更多的提点而不是指责.   1.ALinq 简单的排序查询 在ALinq中查询数据排序是使用OrderBy关键词,这和Linq to SQL是没有区别的,查询的时候默认的是升序

ALinq 入门学习(三)--Where 条件查询

ALinq 中的Where条件查询和 Linq to SQL 中的Where条件查询是一样的操作方式.其作用也就是过滤查询.   1. ALinq 的简单查询 ALinq 的简单查询  1 public void Function() 2         { 3             OA_DBDataContext context = new OA_DBDataContext(new SqlConnection(connectionString)); 4             contex

ALinq 入门学习(八)--ALinq 对Vs2010 的支持

1.       ALinq FOR  VS2010 简介 之前写过一些关于ALinq 的相关文章,详细请参考如下:     ALinq入门学习(一)--ALinq简介     ALinq入门学习(二)--DataContext     ALinq入门学习(三)--Where条件查询     ALinq入门学习(四)--查询关键字     ALinq入门学习(五)--插入数据     ALinq入门学习(五)--删除修改数据     ALinq入门学习(六)--Join连接查询     ALin

ALinq 入门学习(四)--查询关键字

在SQL查询中对应着各种各样的查询关键字,如果distinct,count,sum 等等一些关键字.在Linq to SQL 中对这些关键字的使用做了封装,同样在ALinq 中也有相同的操作函数.   1. ALinq 过滤查询重复数据 Distinct ALinq 过滤查询重复数据Distinct  1 /// <summary> 2         /// ALinq 查询关键字 Distinct 3         /// </summary> 4         publi

ALinq 入门学习(一)--ALinq简介

不写文章有几日了,这些天都浪迹于java程序中,潜心修炼java中的Spring框架,感触良多.不过我还是不打算写java相关的文章,因为java我还是菜鸟.前些天写过关于自己的一个ORM框架(点击阅读),希望看过的同仁们有些收获.做程序我喜欢开源,虽然上次老赵"鄙视"过我们,不是其他的原因,开源达到了资源共享的目的..NET 中出的ORM框架也不少了,Hibernate的克隆版NHibernate,还有Linq to SQL ,Entity FrameWork ,ALinq.接下我要

ALinq 入门学习(二)--DataContext

 1.       ALinq 之DataContext简介 本系列文章使用SQL Server2005 数据库,.NET 3.5 环境. 首先我们建立一个OA_DB数据库,其中建立了三张表,表结构如下图: ORM 映射的主要作用使用对象形式操作数据库,那我们如何使用对象形式去操作以上数据库的三张表呢,那这里讲到的的就是DataContext.DataContext 的作用很明确,就和Linq to SQL 中的DataContext 的作用一样: 把查询句法翻译成SQL语句,以及把数据从数据库

开源中国iOS客户端学习 (六) 网络连接检测

开源中国iOS客户端基于网络同步数据,从而达到与网页看到同样数据效果,所以在启动程序的时候需要检查网络:这也是每一个联网应用启动的第一步,如果联网应用没有检查网络,苹果公司将不予以审核通过: 开源中国iOS客户端大牛们在写网络检测时很迷惑人,开始以为他们用的是ASI类库做的网络检测,今天才看明白,他们并不是用的ASI类库检测,而是用到AFNetworking这个类库里一个实例方法做网络连接检测: 先看Appdelegate文件: 在application:didFinishLaunchingWi

MySQL入门学习(六)

mysql MySQL入门学习(六) --修改和备份.批处理   有时我们要对数据库表和数据库进行修改和删除,可以用如下方法实现: 1.增加一列: 如在前面例子中的mytable表中增加一列表示是否单身single: mysql> alter table mytable add column single char(1); 2.修改记录 将abccs的single记录修改为"y": mysql> update mytable set single='y' where nam

Oracle数据库入门之多表连接与子查询

Oracle表连接 概述:SQL/Oracle使用表连接从多个表中查询数据 格式:select 字段列表 from table1,table2 where table1.column1=table2.column2; 说明:当被连接的多个表中存在同名字段时,必须在该字段前加上"table."作为前缀 如果没有限定where连接条件,否则就会出现笛卡尔集的不现实或没有实用意义的结果 举例:select empno, ename, sal, emp.deptno, dname, loc f