從sql走向linq的我撞死在起點上

2022-01-12 09:02:48 字數 4038 閱讀 5510

【本文純個人理解,錯誤輕噴,非常希望能有大神指點】

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中的左右內連線】

linq的lambda

生成的sql

var queryleft = from 

tin con.transsection_baseprice  

join 

u in con.sys_staff on t.input_man equals u.codeuser 

into trannew

from 

tr in trannew.defaultifempty()

select new

;select

1 as "c1",

"extent1"."dest_place" as "dest_place",

"extent1"."if_valid" as "if_valid",

"extent1"."info_id" as "info_id",

"extent1"."input_time" as "input_time",

case when ("extent2"."id" is null) then "extent1"."input_man" else "extent2"."username" end as "c2"

from "jsxw"."transsection_baseprice" "extent1"

left outer join "jsxw"."sys_staff" "extent2" on ("extent1"."input_man" = "extent2"."codeuser") or (("extent1"."input_man" is null) and ("extent2"."codeuser" is null))

var queryright = from u in con.sys_staff

join t in con.transsection_baseprice on u.codeuser equals t.input_man

into unew

from un in unew.defaultifempty()

select new

;select

1 as "c1",

"extent2"."dest_place" as "dest_place",

"extent2"."if_valid" as "if_valid",

"extent2"."info_id" as "info_id",

"extent2"."input_time" as "input_time",

"extent1"."username" as "username"

from "jsxw"."sys_staff" "extent1"

left outer join "jsxw"."transsection_baseprice" "extent2" on ("extent1"."codeuser" = "extent2"."input_man") or (("extent1"."codeuser" is null) and ("extent2"."input_man" is null))

var queryinner = from t in con.transsection_baseprice

join u in con.sys_staff on t.input_man equals u.codeuser

select new

;select

1 as "c1",

"extent1"."dest_place" as "dest_place",

"extent1"."if_valid" as "if_valid",

"extent1"."info_id" as "info_id",

"extent1"."input_time" as "input_time",

"extent2"."username" as "username"

from "jsxw"."transsection_baseprice" "extent1"

inner join "jsxw"."sys_staff" "extent2" on ("extent1"."input_man" = "extent2"."codeuser") or (("extent1"."input_man" is null) and ("extent2"."codeuser" is null))

上面第二行,我圖灰了的,是我在網上找到的right join。之所以圖黑,是因為我覺得它不對,它其實也是左連線,只是把左右兩張表順序換了而已。我也未曾找到實現right join的linq語句。而隨著我的不斷尋找,我越來越多的接觸到一直說法,也就是,linq與sql無關性。當然,意思並不是說linq與sql是沒有關係的,相反,它們的關係非常大,但是,如果我們想linq的時候總是被sql的想法左右,會導致一些大家都不願意看到的結果,比如有些本來很簡單的工作我們把它弄得複雜甚至無法解決。因為我們面對的不再是【表】而是【對像】。

所以,我拋開了上面那種尋找左右聯接與linq的思路,把自己想成乙個不會sql的新人,去學習linq。而就在我學習linq的時候,發現linq中有許多sql裡面根本沒有的東西,而這些東西,通常是我們可以繞開sql中的複雜聯接可以直接得到的。

而且我發現,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一杦,現在,知恥而後勇,進行再學習。後面我們繼續把我的學習筆記送上來~~

跌跌撞撞我也進入了STM32的大門

今天開始我開始寫我的csdn部落格了,之前學c 的時候也零零散散寫過幾篇,但都是玩兒,太隨意了,這次我要堅持下去,或許一年後或幾年後我還會回來看看,希望到那時我會發現 嗨我真的進步了不少哈!部落格我的想法是前期一星期至少一篇,內容是對本星期學習和工作的總結。dht11的使用和與stm32的通訊 1 ...

sql轉Linq的工具

本文 這些天寫linq挺煩人的,就上網搜搜可有什麼好的sql轉linq的工具,咦,馬上就看上了linqer。哈哈,介紹一下使用方法吧 第一步 執行這個神馬檔案。第二步 指定乙個路徑給它。他會生成乙個linqer.exe可執行的檔案。第三步 執行這個exe檔案,點選add按鈕,第四步 在彈出的add介...

從技術走向管理的注意要點

1 制定計畫,讓計畫成為習慣,在做具體計畫之前,需要做好必要的準備工作。2 轉變思維習慣和行為習慣。3 以目標為導向,關注結果。4 從整體和全域性出發,具有全域性思維,多角度看問題,注意細節,分清輕重緩急。5 聚焦有點,尊重,換位思考。6 集思廣益,凝聚團隊力量,善於整合團隊資源,身先士卒。7 信任...