Linq lambda表示式經驗總結

2022-05-10 17:29:34 字數 1443 閱讀 1324

linq有很多值得學習的地方,這裡我們主要介紹linq lambda表示式,包括介紹expression tree等方面。

linq lambda表示式

了解過c# 3.0的新特性的話應該知道,在c# 3.0中新引入了乙個語法結構,稱為lambda expression(linq lambda表示式/匿名函式)。對此尚不了解的也可以到msdn上看看,linq lambda表示式。linq lambda表示式既可以賦值給乙個委託(delegate)型別,例如action、func等系列的內建委託型別;也可以賦值給expression型別,例如以下linq lambda表示式:

x =>-x

當它被直接賦值給func型別的變數時,c#編譯器會將它的內容編譯為乙個靜態方法,並建立乙個對應型別的引用賦值給變數。

static class program

}c#編譯器會編譯為類似下面的**:

internal static class program

[compilergenerated]

private static int<

main

>

b__0( int x )

private static void main( string[ ] args )

}(實際上還涉及到快取那個委託,這裡省略掉了。另外,之所以會編譯為乙個靜態方法是因為這個linq lambda表示式沒有使用任何「自由變數」,也就是既不是引數或區域性變數也不是類的成員的變數。在現有的c#編譯器實現中,如果乙個匿名函式使用了「this」,那麼對應生成的方法會是成員方法;如果使用了其它自由變數的話則會生成乙個私有內部類來存放匿名函式所使用到的自由變數,並在這個內部類裡生成匿名函式對應的方法。這裡作為例子選擇了最簡單的情況來介紹。)

如此將乙個linq lambda表示式編譯為乙個實際的函式後,其中的msil位元組碼可以為clr所理解並執行。這樣就足夠實現in-memory query了,例如linq-to-objects、linq-to-dataset等。但其它平台無法理解msil,要對函式進行分析然後執行就會十分困難。例如說,如果想讓乙個linq lambda表示式在sql server上執行,該如何讓sql server也理解它呢?

expression tree與linq lambda表示式

msil之所以不便於分析是因為它將原本是樹狀結構的程式**轉換為了線性結構,損失了一些資訊,主要是損失了程式**的「結構性」,更接近於底層而降低了抽象程度。

我們知道,程式源**對應著具體語法樹(concrete syntax tree),每個葉節點對應著**裡的乙個詞素,其上則是各種語法結構,如表示式、語句、宣告、定義等。抽象語法樹(abstract syntax tree,ast)則在具體語法樹的基礎上將一些諸如關鍵字、括號等冗餘資訊去掉,讓樹更加整潔,便於分析而不損失任何有用的資訊。

初識linq,lambda表示式

linq是微軟提供的一堆擴充套件方法。通過例子熟悉。對int陣列元素進行篩選 int values ienumerable e1 values.where i i 10 foreach int i in e1 可以用var進行型別推斷,過濾掉負數,把陣列排序,然後元素兩邊加 輸出簡化 var e1 ...

動態LINQ(Lambda表示式)

1.準備資料實體 public class data public int count 建立測試資料 public static listgettestdata data account1 new data data account2 new data data account3 new data ...

動態LINQ(Lambda表示式)構建

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!最近一直都忙於專案也沒什麼時間好好總結一下自己在專案中或平時的收穫 大家都知道現在為了提高開發效率,有關於和資料庫互動方面的部分我們一般都會用orm框架,例如entityframework,nhiberhate,linq to sql等,所以我們隊...