首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Lambda 表達式作為查詢條件傳遞:Expression> 實戰

     編輯:程式設計綜合問答

接口定義:

public virtual PageInfo Query(int pageNumber, int pageSize, Expression> where);

調用時如何寫 Lambda?

標準調用姿勢

// 假設實體類有 Id 屬性
var list = this.Query(pageIndex, pageSize, x => x.Id == 1);
// x => x.Id == 1  自動推導為 Expression>

為什麼用 Expression 而非 Func?

類型本質適用場景
Func委托,編譯為 IL 代碼,只能在內存執行LINQ to Objects (List.Where)
Expression>表達式樹,編譯為數據結構,可遍歷解析翻譯為 SQLEntity Framework / Dapper / 自定義 ORM

Repository 模式下,Query 內部會解析表達式樹生成 WHERE Id = 1 SQL 片段,所以必須用 Expression。

動態構建條件(進階)

// 運行時根據用戶輸入組合條件
Expression> predicate = u => u.IsActive;
if (!string.IsNullOrEmpty(keyword))
    predicate = predicate.And(u => u.Name.Contains(keyword));
if (roleId > 0)
    predicate = predicate.And(u => u.RoleId == roleId);

var list = Query(page, size, predicate);

需引用 LinqKit 或自寫 ExpressionVisitor 實現 And/Or 組合。

常見錯誤

  • x => x.id == 1 寫成 x => x.id = 1(賦值而非比較)。
  • Lambda 參數類型不匹配:泛型 `T` 必須與實體類一致。
  • 在 Expression 中調用無法翻譯的方法(如 .ToString()、自定義方法),會報「cannot be translated to SQL」。

掌握 x => x.Property == value 基礎語法,配合 Expression 表達式樹理解,即可駕馭主流 ORM 查詢接口。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved