IQueryable/IQueryable 和表達式樹 IQueryable有兩個組件 Expression:當前查詢的組件的與語言和數據源無關的表示形式,以表達式樹的形式表示。 Provider:LINQ 提供程式的實例,它知道如何將當前查詢具體化為一個值或一組值。 ![](https://img ...
IQueryable/IQueryable
IQueryable有兩個組件
Expression:當前查詢的組件的與語言和數據源無關的表示形式,以表達式樹的形式表示。
Provider:LINQ 提供程式的實例,它知道如何將當前查詢具體化為一個值或一組值。
在動態查詢的上下文中,提供程式通常會保持不變;查詢的表達式樹將因查詢而異。
表達式樹是不可變的;如果需要不同的表達式樹並因此需要不同的查詢,則需要將現有表達式樹轉換為新的表達式樹,從而轉換為新的 IQueryable。
從表達式樹中使用運行時狀態
內部表達式樹以及查詢尚未修改;查詢只返回不同的值,因為 length 的值已更改。
使用工廠方法構造表達式樹和查詢
構造 Expression
(截取片段)
構造要傳入到某個 LINQ 方法的表達式時,實際上是在構造 Expression
LambdaExpression 具有兩個組件:
參數列表 (string x) 由 Parameters 屬性表示。
主體 x.StartsWith("a") 由 Body 屬性表示。
構造 Expression
- 使用 Parameter 工廠方法為 lambda 表達式中的每個參數(如果有)定義 ParameterExpression 的對象。
ParameterExpression x = Expression.Parameter(typeof(string), "x");//個人理解就是參數類型以及參數名稱 - 使用你定義的 ParameterExpression 和 Expression 的工廠方法來構造 LambdaExpression 的主體。 例如,表示 x.StartsWith("a") 的表達式的構造方式如下:
Expression body = Call(
x,
typeof(string).GetMethod("StartsWith", new[] { typeof(string) })!,
Constant("a")
);//拆分表達式給body賦值 - 使用適當的 Lambda 工廠方法重載,將參數和主體包裝到編譯時類型的 Expression
中:
Expression<Func<string, bool>> expr = Lambda<Func<string, bool>>(body, x);