Func<T, bool>與Expression<Func<T, bool>>的區別
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>>的區別