LINQ 常規實踐總結

2022-01-10 06:50:59 字數 3522 閱讀 4125

orderby的意義是按照指定順序排序,連續兩次orderby,後面乙個有可能會打亂前面乙個的排序順序,可能與預期不符。

要實現sql中的order by word,name類似效果; linq 有thenby可以緊接使用, thenby記住原本排序的值,然後再排其他值, 正因如此,thenby是針對iorderenumerable 進行呼叫的。

group join操作符常用於返回『主鍵物件-外來鍵物件集合』的查詢,例如『產品類別-此類別下所有的產品』的模式。

//

查詢語法

var query =

from c in

db.categories

join p

indb.products on c.categoryid equals p.categoryid into r

select

new; //

方法語法

var q =db.categories

.groupjoin

( db.products,

c =>c.categoryid,

p =>p.categoryid,

(c, p) => new

);

這樣就可以結合 defaultifempty 理解 left outer join的linq寫法。

group join生成的sql接近於:

select categories.*, products.*

from

categories

left

join products on categories.id =

products.cateid

order

bycategories.id //

group

join 有點類似於 left

join 資料膨脹的效果

linq2sql join語法預設得到的是inner join

model1container model = new

model1container();

//內連線

var query = from s in

model.student

join c

inmodel.course on s.coursecno equals c.cno

where c.cno == 1

select

new };

foreach (var item in

query)

在sql profile裡面監控到與上面linq2sql 對應的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

linq2sql 左連線

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

};//outer

join時必須將join後的表into到乙個新的變數gc中,然後要用gc.defaultifempty()表示外連線(沒有匹配的記錄欄位設為null)

foreach (

var item in

query)

// 上例中使用了defaultifempty操作符,它能夠為empty序列(注意是empty序列而不是null序列)返回乙個預設元素序列,defaultifempty使用了泛型中的default關鍵字。

gc.defaultifempty(new course ) //

設定為空時的預設值

與以上linq2sql對應的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

]

在日常linq實踐中,按照某種預期寫定的linq, 在執行檢索時某些元素會爆出異常,導致整個檢索失敗;如果我們能容忍某些元素的異常,繼續完成整個linq檢索,可以寫乙個擴充套件方法,忽略報錯元素。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

enumerable

catch

//yield 返回列舉器指向的當前元素

if(next)

yield

return

enumerator.current;}}

}}

}

這個擴充套件方法的思路是  重寫foreach語法糖的預設邏輯:

能夠使用foreach語法的序列必定實現ienumerable介面,此處我們重寫了該介面的預設迭代器使用方式。

五一常規總結

其實這篇部落格本來是昨天五月一日寫的,奈何昨天晚上回家太晚,早把這事拋到九霄雲外去了,所以還是今天來總結五一之前的課吧。了解了相當於高階版的二分演算法,知道了原來二分也是要控制的這麼精密,二分法找答案,最小中求最大,或最大中求最小時,當然對未排序的要先排序 應用範圍 1,求值 2,引數間具有相關性時...

常規排序演算法總結

首先推薦乙個學習資料結構的優秀的視覺化 主要總結以下6種排序演算法,其中插入排序 選擇排序 歸併排序 快速排序。1.氣泡排序 bubble sort 和快速排序 quick sort 和隨機快速排序 random quick sort 博文待寫 2.插入排序 insertion sort 和希爾排序...

電腦常規操作總結

1.前提條件 區域網內 從一台電腦進行遠端登入另外一台電腦進行操作時,被登入的電腦必須設定登入密碼才能遠端登入成功,否則不能進行登入。當從一台電腦進行遠端登入另一台電腦時,另一台電腦可以設定多個使用者,然後在賦予其相應的許可權,就可以讓多台電腦同時使用不同的賬戶登入這一台電腦進行操作。以前做乙個專案...