接口定義:
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>
| 類型 | 本質 | 適用場景 |
|---|---|---|
Func | 委托,編譯為 IL 代碼,只能在內存執行 | LINQ to Objects (List.Where) |
Expression | 表達式樹,編譯為數據結構,可遍歷解析翻譯為 SQL | Entity 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(賦值而非比較)。.ToString()、自定義方法),會報「cannot be translated to SQL」。掌握 x => x.Property == value 基礎語法,配合 Expression 表達式樹理解,即可駕馭主流 ORM 查詢接口。