2011-08-22 80 views
5

我知道Lambda表達式是什麼。我不確定這是否與Expression相同。這裏知道的東西似乎還比我知道的要多。表達式與Lambdas

我正在查看wrapping IQueryable並且使用Expressions很多。那麼,例如,這裏的「表達式」參數還有比在Lambda中可以想象的更多嗎?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
} 

回答

4

lambda表達式是被編譯,根據上下文,成兩件事情之一編譯器的功能:

  • A(隱藏)功能和委託給它
  • Expression

一旦應用程序被編譯,lambda表達式的概念是不存在的,因爲它已經TU歸入上述兩種選擇之一。

我不知道你所說的

的意思是有更多的「表達」參數在這裏比在拉姆達

的表達式封裝被認爲並表示應用程序邏輯以一種可檢查的形式(換句話說,它可以讓你看到開發人員在所調用的屬性和函數,包括常量,比較等方面寫的內容)。這就是查詢提供者(大多數情況下,像實體框架這樣的對象關係映射器)獲取代碼並將其轉換爲SQL的方式。

+0

1優良的答案。發現!!! – gideon

1

Lambdas通常是編譯代碼,其中Expression表示「抽象語法樹」(AST),即。代表代碼的數據結構,並且可以編譯爲代碼。 IQueryable通常在Expression上運行,因爲它應該將AST編譯爲在不同環境中運行的代碼,如SQL服務器,而不僅僅是主機。有IQueryableProviders可編譯爲SQL(Linq2Sql),JavaScript,OpenGL着色器(Bling)等。

C#編譯有時可以把一個lambda到表達,如果該方法參數期望的權利類型的表達式:

void Foo(Expression<Func<int>>) { ... } 
... 
Foo(() => 3); 
+0

「Lambdas通常是編譯代碼」這是不正確的,而lambda當然可以用來創建編譯代碼(它們成爲隱藏的,編譯器生成的函數的委託),它們也用於創建'Expression'對象;無論哪一個都是由上下文決定的。因爲你關於AST的信息當然是正確的,但第一句話意味着Lambdas和表達式之間有區別。 –

+0

強調*一般*。 lambda表達式的全部表現力目前僅供委託人使用,因爲「statement lambdas」不能編譯爲表達式。表達式是lambdas的一個貧窮的子集。我也估計大部分lambda使用是System.Linq,它使用委託,但也許我偏向於這個估計。 – naasking

+0

我不贊同那裏;我認爲大部分LINQ語句都是作爲LINQ-to-SQL或實體框架查詢的一部分(其他ORM顯然也支持Expression語法,但我不認爲它們的用法幾乎與EF或L2S一樣高)。我認爲絕大多數關於StackOverflow的「LINQ」問題都引用了這兩個框架之一(EF正在開始接管大部分的份額,但L2S並不是懶惰)。 –