1. 程式人生 > >Func<T, bool>與Expression<Func<T, bool>>的區別

Func<T, bool>與Expression<Func<T, bool>>的區別

color 數據 manager on() pub static 案例 query sql語句

Func<T, bool>與Expression<Func<T, bool>>的區別


Func<T, bool>是委托(delegate)

Expression<Func<T, bool>>是表達式

Expression編譯後就會變成delegate,才能運行。比如

Expression<Func<int, bool>> ex = x=>x < 100;

// 將表達式樹描述的 lambda 表達式編譯為可執行代碼,並生成表示該 lambda 表達式的委托。

Func<int, bool> func = ex.Compile();

然後你就可以調用func:

func(5) //-返回 true

func(200) //- 返回 false

而表達式是不能直接調用的。

案例:

public class DB
{
static public ISession Session
{

get { return SessionManager.GetCurrentSession(); }
}

//錯誤的代碼
static public IList<T> Query1<T>(Func<T, bool> where)
{
return Session.Query<T>().Where(where).ToList();
}

//正確的代碼
static public IList<T> Query2<T>(Expression<Func<T, bool>> where)
{
return Session.Query<T>().Where(where).ToList();
}
}

//不正確的查詢代碼如直接<Func<T, bool>作為參數造成的數據庫全表查詢

IList<Person> DB.Query1<Person>(obj=>obj.age>12); //查詢年齡大約12

//正確的做法是使用Expression作為參數

IList<Person> DB.Query2<Person>(obj=>obj.age>12); //查詢年齡大約12

使用這兩種參數的函數對調用者來說發現問題,不過還是可以通過輸出的SQL語句看出問題,使用Func直接作為參數,SQL中沒有where語句,直接進行了全庫檢索。


註:
Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型。這個是祖宗。
Func可以接受0個至16個傳入參數,必須具有返回值。
Action可以接受0個至16個傳入參數,無返回值。
Predicate只能接受一個傳入參數,返回值為bool類型。

Func<T, bool>與Expression<Func<T, bool>>的區別