Linq to EF 内连接和左外连接

Linq中连接主要有组连接、内连接、左外连接、交叉连接四种。本文主要讲解没连接和左外连接。

本次使用到的数据实体模型具体的创建方法不再累述。该实体模型中包括Student、Course两个表,他们之间是一对多的关系。

一、内连接

内连接与SqL中inner
join一样,即找出两个序列的交集

           Model1Container model = new Model1Container();
            //内连接
            var query = from s in model.Student
                        join c in model.Course on s.CourseCno equals c.Cno
                        where c.Cno == 1
                        select new
                        {
                            ClassID = s.CourseCno,
                            ClassName = c.Cname,
                            Student = new
                            {
                                Name = s.Sname,
                                ID = s.Sno
                            }
                        };
            foreach (var item in query)
            {
                Response.Write("ClassID:" + item.ClassID + "ClassName:" + item.ClassName + "Name:" + item.Student.Name);
            }

与上面的内连接语句相对应的SQL脚本语言如下所示:

SELECT [t0].[CourseCno] AS [ClassID], [t1].[Cname] AS [ClassName], [t0].[Sname] AS [Name], [t0].[Sno] AS [ID]
FROM [Student] AS [t0]
INNER JOIN [Course] AS [t1] ON [t0].[CourseCno] = [t1].[Cno]
WHERE [t1].[Cno] = @p0

二、左外连接

左外连接与SqL中left
join一样

            Model1Container model = new Model1Container();
            var query = from s in model.Student
                        join c in model.Course on s.CourseCno equals c.Cno into gc
                        from gci in gc.DefaultIfEmpty()
                        select new
                        {
                            ClassID = s.CourseCno,
                            ClassName = gci.Cname,
                            Student = new
                            {
                                Name = s.Sname,
                                ID = s.Sno
                            }
                        };
            //Outer join时必须将join后的表into到一个新的变量gc中,然后要用gc.DefaultIfEmpty()表示外连接。
            foreach (var item in query)
            {
                Response.Write("ClassID:" + item.ClassID + "ClassName:" + item.ClassName + "Name:" + item.Student.Name);
            }

注:上例中使用了DefaultIfEmpty操作符,它能够为实序列提供一个默认的元素。DefaultIfEmpty使用了泛型中的default关键字。default关键字对于引用类型将返回null,而对于值类型则返回0。对于结构体类型,则会根据其成员类型将它们相应地初始化为null(引用类型)或0(值类型)

我们可以不使用default关键字,但在要DefaultIfEmpty中给定当空时的默认对象值。语句如下:

            //left join, 为空时使用默认对象
            var leftJoinQuery = from s in model.Student
                                join c in model.Course
                                on s.CourseCno equals c.Cno into gc
                                from gci in gc.DefaultIfEmpty(
                                new Course { Cname = "",Cperiod="" }     //设置为空时的默认值
                                )
                                select new
                                {
                                    ClassID = s.CourseCno,
                                    ClassName = gci.Cname,
                                };

与上面的左外连接语句相对应的SQL脚本语言如下所示:

SELECT [t0].[CourseCno] AS [ClassID], [t1].[Cname] AS [ClassName], [t0].[Sname] AS [Name], [t0].[Sno] AS [ID]
FROM [Student] AS [t0]
LEFT OUTER JOIN [Course] AS [t1] ON [t0].[CourseCno] = [t1].[Cno]

当然也可以通过LinqPad工具查看上面的左外连接语句的Lamada表达式,在此不再累述。

以上是自己学习时的一点见解,不对之处请拍砖指教。

时间: 2024-08-03 03:09:21

Linq to EF 内连接和左外连接的相关文章

内连接、左外连接、右外连接、交叉连接区别

内连接.左外连接.右外连接.交叉连接区别 http://blog.csdn.net/cnham/archive/2008/06/25/2584936.aspx 在之前,我对MSSQL中的内连接和外连接所得出的数据集不是很清楚.这几天重新温习了一下SQL的书本,现在的思路应该是很清楚了,现在把自己的理解发出来给大家温习下.希望和我一样对SQL的连接语句不太理解的朋友能够有所帮助.(发这么菜的教程,各位大大们别笑话偶了,呵:D ) 有两个表A和表B.表A结构如下: Aid:int:标识种子,主键,自

SQL:内连接、左外连接、右外连接、全连接、交叉连接区别

有两个表A和表B.表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据情况,即用select * from A出来的记录情况如下图1所示: 图1:A表数据表B结构如下: Bid:int:标识种子,主键,自增ID Bnameid:int 数据情况,即用select * from B出来的记录情况如下图2所示: 图2:B表数据为 了把Bid和Aid加以区分,不让大家有误解,所以把Bid的起始种子设置为100.有SQL基本知识的人都知道,两个表要做连接,就必须有个

内连接association 左外连接collection

前提条件: 学生表 (多  子表) 年级表(一  主表) 1,第一种情况:先查子表所有 student.sql.xml文件如何配 由于有多表连接,无法把查询结果直接封装成一个实体对象-------->   结果转换规则:自己手动指定 内连接 返回单个association <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//D

SQL 四种连接:内连接、左外连接、右外连接、全连接--转载

原文:http://zwdsmileface.iteye.com/blog/2191730 个人理解 内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   之类的比较运算符).包括相等连接和自然连接. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行 左连接(LEFT   JOIN   或   LEFT   OUTER   JOIN)是右左边表中的数据为基准,若左表有数据右表没有数据,否则显示左表中的数据右表中的数据显示为空 右连接(RIGHT  JO

SQL Server内连接、左外连接、右外连接、完全连接、交叉lianjie

数据准备: create table T1( A varchar(10) not null, B varchar(10) not null, C tinyint not null ); create table T2( B varchar(10) not null, E tinyint not null ); insert into T1 values ('a1', 'b1', 5), ('a1', 'b2', 6), ('a2', 'b3', 8), ('a2', 'b4', 12); ins

深入理解关系中的外连接,左外连接,右外连接

[原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

左外连接,右外连接,全外连接

左外连接 用在查询块的from短语中 又称左连接,列出左边所有元组,A left join B on 条件表达式中的on决定了B表中符合条件表达式的数据才保留,不符合的右边字段为null where短语的条件等到外连接结束后才使用,对外连接结果进行过滤 例子: create table t1(c1 int primary key, c2 int); create table t2(cc1 int primary key, cc2 int); insert into t1 values (1,1)

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(转载)

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.     2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEFT