Linq表示式 Lambda表示式你更喜歡哪個?

2022-09-14 14:42:10 字數 3845 閱讀 7153

如圖:

由此可見linq表示式和lambda表示式並沒有什麼可比性。

那與lambda表示式相關的整條語句稱作什麼呢?在微軟並沒有給出官方的命名,在《深入理解c#》中稱為點標記。

所以,我們的標題的提問根本就不合適。應該是「查詢表示式和點標記你更喜歡哪個?」。如:

//查詢表示式

var students1 = from t in db.students

where t.name == "張三"

select new ;

//點標記

var students2 = db.students

.where(t => t.name == "張三")

.select(t => new );

我相信更多的人偏向選擇點標記。具體什麼原因我也說不清(可能是點標記中的lambda更加優雅吧)。對於我個人來說,也是更加喜歡點標記這種方式。

1、所有的查詢表示式都可以轉成對應的點標記。反之,不是所有的點標記都可以轉成查詢表示式。

為什麼?因為查詢表示式在編譯後就直接變成了點標記:(以下是上面兩個語句對應的編譯後的反編譯c#**)

生成了一模一樣的**。(由於是編譯後的,好多亂七八糟的**。我們只看where和select關鍵字就知道,使用的都是點標記。)

2、點標記確實比查詢表示式更加優雅

例一:

//查詢表示式

var students1 = from t in db.students

where t.name == "張三"

select t;

//點標記

var students2 = db.students

.where(t => t.name == "張三");

我為什麼一定要 select t 啊,這句沒卵用的廢話就不能省嗎?是的,省了就報錯:

例二:必須需要括號包裹起來才能取結果集?你還能更醜一點嗎?

//查詢表示式

var students1 = (from t in db.students

where t.name == "張三"

select t).tolist();

//點標記

var students2 = db.students

.where(t => t.name == "張三")

.tolist();

例三:(為什麼說:"不是所有的點標記都可以轉成查詢表示式"【此例只適用於ienumerator】)

此條點標記你能轉成查詢表示式嗎?

var list = new list() ;

var students2 = list

.where((item, index) => item == "張三" && index % 2 == 0)

.select((item, index) => new )

.tolist();

查詢表示式你能reverse嗎?

var list = new list() ;

var students2 = list

.where((item, index) => item.contains("張三"))

.select((item, index) => new )

.reverse()//反序

.tolist();

lista.distinct().tolist();//去重

lista.except(listb).tolist();//差集

lista.union(listb).tolist(); //並集

lista.intersect(listb).tolist();//交集

通過上面的對比,好像查詢表示式一文不值了。no,不是這樣的。

比如下面幾種情況我們就可以選擇使用查詢表示式:

例一:(本例適用於linq to object 和 沒有建主外來鍵的ef查詢)

點標記中的join需要傳四個引數表示式,是不是有點暈了。。。

var list1 = new dictionary, , ,  };

var list2 = new dictionary, , , };

//查詢表示式

var obj1 = from l1 in list1

join l2 in list2

on l1.key equals l2.key

select new ;

//點標記

var obj = list1.join(list2, l1 => l1.key, l2 => l2.key, (l1, l2) => new );

例二:

點標記需要區分orderby、thenby有沒有覺得麻煩

//查詢表示式

var obj1 = from l1 in list1

join l2 in list2

on l1.key equals l2.key

orderby l1.key, l2.key descending

select new ;

//點標記

var obj = list1.join(list2, l1 => l1.key, l2 => l2.key, (l1, l2) => new )

.orderby(li => li.l1.key)

.thenbydescending(li => li.l2.key)

.select(t => new );

總覺得查詢表示式更多的只是為了照顧那些寫慣了sql的程式設計師。

關於聯接查詢使用查詢表示式會更合適一些這個上面已經說了。

接下來我們寫內聯、左聯、交叉聯的查詢表示式和對應的點標記**。(目的:可能有些人不會,同時在這裡也給自己做個備忘)

內聯:

左聯:

交叉聯:

其實關於聯接查詢,如果ef建好了主外來鍵我還是覺得點標記用起來更爽爽的。

關於是使用查詢表示式還是點標記,可能起著更大決定性的作用的是團隊共同的習慣和規範。

然後還想說說,只要我們對比什麼,很可能就會有人跳出了,什麼不要比,用好了都一樣,什麼什麼才是最重要的,什麼什麼的。。。

就像很多人會反感j**a和c#的對比,其實我個人覺得對比下底層實現、對比下語法簡易也不是不可以的,只要我們可以從中學到知識(個人也是不喜歡對比 誰誰誰學什麼工資多少多少)。

昨天的自己對比今天的自己,今天的自己對比明天的自己。只要可以進步為什麼不要對比呢?

linq表示式對比lambda表示式

什麼是linq表示式?什麼是lambda表示式?前一段時間用到這個只是,在網上也沒找到比較簡單明瞭的方法,今天就整理了一下相關知識,有空了再仔細研究研究 public program ling表示式 var stus1 from s in allstudent where s.name 王二 sel...

LINQ和Lambda表示式

前段時間接觸了一種新的表示式,但是不知道這個是什麼意思,所以就先站在巨人的肩膀用了,現在聽師哥說這種寫法是 lambda 表示式。我一直以為,這個 lambda 表示式和 linq 查詢有異曲同工之妙,可惜,這樣想就大錯特錯了。定義語言整合查詢 language integrated query 允...

LINQ與Lambda表示式

是微軟提出的一項新技術 能將查詢功能直接引入到.net framwork所支援的程式語言中。查詢操作可以通過程式語言自身來傳達,而不用以字串形式嵌入到 中。主要包括linq to sql,linq to dataset,linq to objects和linq to xml4種技術。在c 後期版本中...