从sql走向linq的问题

A left (outer) join B on A.bid=B.id

上面这句话叫做左连接,原因是left(左)join(加入,连入)被译为左连接,所以,这是关于语法中关键字的翻译,而非连接原理,造成不能以为是从第一张表的左边连接。相反,它是从A表的右边开始连接的。原因很简单,比如一个普通的查询语句:select t.id TID from table1 t。后面的那个t是对table1的标记,再看TID它也是对t.id的标记,它们的功能是什么我们暂且不说,起码我们知道了sql的语法习惯是将附加的参数或者说明后置。这样我就再看上面的左连语句,就知道了left和join屁关系没有。语句的划分应该是:select A.* from A left join B on A.bid=B.id。outer没写,是因为所有的left join都是left outer join,right join类推!回到我们刚刚的那个语法,红色的部分代表了整个语句的操作及限定关键字,而left则是A的后置附加信息,它的意思是说,A是放在左边的,同样,你若把left换成Right就成了A放在右边,而如果后面加了Outer了呢,outer和join对是一对,他俩与inner join相对应,这下就好理解了,因为inner join将两张表里面所有的为空的记录都弃掉,所以,不需要哪个是左哪个是右,所以,A表后面的left或者right就被省略了,直接是A inner join B on。话说回来了,为什么要分左边呢?很简单,我们画表喜欢从左往右,左边定下了,再画右边,也就是,先把左边的表查出来,再把右边的取出来往上面拼,能拼多少拼多少。

【linq中的左右内连接】

上面第二行,我图灰了的,是我在网上找到的right join。之所以图黑,是因为我觉得它不对,它其实也是左连接,只是把左右两张表顺序换了而已。我也未曾找到实现right join的Linq语句。而随着我的不断寻找,我越来越多的接触到一直说法,也就是,Linq与sql无关性。当然,意思并不是说linq与sql是没有关系的,相反,它们的关系非常大,但是,如果我们想linq的时候总是被sql的想法左右,会导致一些大家都不愿意看到的结果,比如有些本来很简单的工作我们把它弄得复杂甚至无法解决。因为我们面对的不再是【表】而是【对像】。

所以,我抛开了上面那种寻找左右联接与linq的思路,把自己想成一个不会sql的新人,去学习linq。而就在我学习linq的时候,发现linq中有许多sql里面根本没有的东西,而这些东西,通常是我们可以绕开sql中的复杂联接可以直接得到的。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/SQLServer/

而且我发现,linq中的join与sql中的join完全不是一个东西,或者说,它们根本没有血缘关系,有点儿像c与c++的感觉。

这样,我们就必须有一种新的思路,要找寻这条新的思路,我们要先看看我们之前为什么要寻找linq与sql的关系。

{查询数据的需求}--->{本来用sql的时候我们会写成的sql语句}--->{与sql语句相匹配的linq}

看吧,我们明知道sql转linq没有教程,linq转sql微软也没有明确给出算法,我们却还要这般折磨自己,何苦呢~~

那么我们就收回那颗自以为自己很牛逼的心,把我们的做法换一下:

{查询数据的需求}--->{解决需求的linq}

这种情况下,我们只会遇见两人种问题:一、linq完成不了我们的需求;二、效率问题。我们先来一个个看。第一个,我觉得问题不大,毕竟是一种语言,语言都是符合语言的规格的,没有它完不成的需求,只有它顾及不上的第二人问题。我们来看第二个问题,就是效率问题,这确实是一个大问题 ,因为,如果你写linq写得热血朝天,那么你完全可以认为,你的linq效率极低,我看见过一条linq语句,里面有几十个方法。linq也像sql一样,是一种需要构造的语言,所以,在写之前,我们必须要对linq进行深入的理解与学习,就像当初学习sql一样,看一条sql完全可以执行它大概的执行复杂度。好了,我们的问题出来了,就是学习linq!

linq之前我也有学习过,也有用过,但是,当时太年轻了,小菜b一杦,现在,知耻而后勇,进行再学习。

时间: 2024-11-01 17:39:29

从sql走向linq的问题的相关文章

Entity SQL与LINQ TO Entity的本质区别

由此可以看出其最终都转移成Command Tree 然后再转换成对应数据库的T-SQL语句,本质差别不大 ,但是有时执行特殊查询语句的时候还是有点不一样的,因为Entity SQL的T-SQL语句是我们自己定义的,而 LINQ to Entity最后转换的T-SQL语句是由Entity引擎转换的,有时我们用SQL Server Profiler检测执行的 SQL语句的时候LINQ to Entity执行的SQL往往让我们不容易理解,所以在需要对某些查询/修改/更新执行操作 的时候如果发现执行效率

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq

LINQ,语言集成查询,就是把一些查询操作集成到语言中(貌似是废话),比 如查询关系数据库,而且提供一种一致的操作方式,不管最终的数据存储在哪里 ?内存中,远程数据库还是一Xml格式文件存储,不仅仅如此,你还可以用你丰 富的想象力扩充自己的查询.Linq to SQL无疑把Linq的能量发挥的淋漓尽致, 我们就以Linq to SQL的体系结构来学习一下Linq的整体框架. 在上两章 里面我们通过源代码探讨了关于DataContext的初始化和Table<TEntity> 对象的获取,以及Pr

SQL To LinQ 你知道么?

    学习linQ的时候,你应该用到过LinQ to SQL 的工具---LinQPad,刚开始用,不太熟悉,尤其是涉及到多表查询,不会写LinQ语句怎么办?    这不是问题,下面先来介绍另一个工具 SQL to LinQ,SQL已经学了很长时间了,做系统的时候经常用到,对于SQL语句应该不陌生吧.    打开SQL Server 2008 ,新建查询,我想把三张表中的信息一一对应起来,并且只要我想要的字段的信息,SQL语句:  SELECT [t2].[VirtualExamRoomId]

SQL 转化LINQ 或 lambda表达式

问题描述 SQL转化LINQ或lambda表达式SELECTb.*FROM(SELECTappli_no,max(revision_no)ASrevision_noFROMTBAARS_COMMITTEE_APPLICATIONGROUPBYappli_no)aINNERJOINTBAARS_COMMITTEE_APPLICATIONbON(a.appli_no=b.appli_noANDa.revision_no=b.revision_no) 解决方案 解决方案二:varquery=fromx

sql转Linq的工具

本文转载:http://www.cnblogs.com/huangxincheng/archive/2011/05/12/2044990.html 介绍一个小工具 Linqer   这些天写Linq挺烦人的,就上网搜搜可有什么好的sql转Linq的工具,咦,马上就看上了Linqer. 哈哈,介绍一下使用方法吧: 官方下载网站:http://sqltolinq.com/download. 第一步:运行这个神马文件. 第二步:指定一个路径给它.他会生成一个Linqer.exe可运行的文件. 第三步:

Sql To Linq转换问题

问题描述 我有一个Sql语句,有两种写法都是对的如图这两种写法的结果是一样的同样转成Linq也有两种写法而转成Linq以后Temp0有数据,而Temp是没有数据的.不知道这两种Linq方法有什么不同,求大神解答一下谢谢! 解决方案 解决方案二:sqltolinq?没听说过这种字眼.问题就在于查询方式.temp使用的from,where后边有跟了一大堆的条件.很明显条件都是"并且"的关系,能保证这个里的条件都成立?如果有一个不成立就没有数据.temp0就不一样,没from一次就join一

SQL转LinQ

问题描述 selecta.code,b.name,(selecttop1isnull(desc,'')fromtb_cwherecode=a.codeandYEAR(keepdate)=YEAR(@date)andMONTH(keepdate)='1')asN'1月描述'fromtb_aaleftjointb_bbona.id=b.id 主要是字段里是SQL语句,这linq弄了好久没弄出来,在线求解 解决方案 解决方案二:你这段sql语句能查询吗?isnull(desc,'')这个里面的保留字括

SQL、LINQ和Lambda表达式

首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询这三者的不同实现. 简单介绍 LINQ(Language Integrate Query)是语言集成查询他在对象和数据之间建立一种对应的关系,可以使用访问内存对象的方式查询数据集合.LINQ查询是C#中的一种语言构造.因此开发人员可以再C#代码汇总嵌套类似于SQL语句的查询表达式,从而实现数据查询的

关于LinQ to SQL 和 LinQ to Entity的问题

问题描述 我用以上方法建立一个实体类DBML或者EDMX,如果因为需求变动,我不得不增加一个字段,或者去掉一个字段,我该怎么办啊?请高手们帮吗解答啊 解决方案 解决方案二:用ling开发的后果.解决方案三:晕有没有解决方法啊????解决方案四:edmx提供了update功能,会自动同步数据表结构dbml需要重新删除改动的表,重新映射一下