針對中小數據量場景,本文介紹一種相對直觀的 LINQ 多條件查詢實現方式:通過定義一個返回 bool 的實例方法作為篩選邏輯,再利用 Expression.Compile() 將其轉為委托供 Where 使用。雖不如前文的表達式樹方案高效,但邏輯清晰,適合快速原型開發與學習理解。
在頁面類中定義 GetCondition 方法,根據下拉框、文本框等控件值動態判斷實體對象是否符合條件:
private bool GetCondition(FeedBack fb)
{
bool boolResult = true;
int f_type = Int32.Parse(ddlFType.SelectedValue);
int isClose = Int32.Parse(ddlIsClose.SelectedValue);
int isTrue = Int32.Parse(ddlIsTrue.SelectedValue);
string keyword = tbxKeyword.Text.FilterInjectStr();
if (f_type != 0) boolResult &= fb.F_Type == f_type;
if (isClose != -1) boolResult &= fb.IsClose == isClose;
if (isTrue != -1) boolResult &= fb.IsTrue == isTrue;
if (!keyword.IsNullOrEmpty()) boolResult &= fb.ContentInfo.IndexOf(keyword) > -1;
return boolResult;
}
在數據綁定方法中,構建 Lambda 表達式並調用 Compile() 生成委托:
private void ListDataBind()
{
Expression<Func<FeedBack, bool>> expr = n => GetCondition(n);
// Compile() 將表達式樹編譯為可執行委托
List<FeedBack> pageData = feedBacks.AllFeedBacks.Where(expr.Compile()).ToList();
FeedbackList.DataSource = pageData;
FeedbackList.DataBind();
}
Expression<Func<FeedBack, bool>>,網上部分教程誤寫為 Expression<bool>> 導致編譯失敗。Compile() 會在運行時生成 IL 代碼,且 Where(expr.Compile()) 導致 LINQ to SQL 無法將邏輯轉譯為 SQL,**會將整表數據拉取到內存後再篩選**,僅適合數據量較小(如幾千條以內)的場景。作者吐槽網上大量複製貼錯誤代碼的現象,提醒初學者:
Expression<Func<T, bool>> 的尖括號嵌套。IQueryable 與 IEnumerable 的區別:前者支持表達式樹轉 SQL,後者僅支持委托在內存執行。這種「委托編譯」方案雖有性能短板,但邏輯直觀、調試方便,是理解 LINQ 動態查詢的良好切入點。掌握其原理後,再進階學習表達式樹動態組合,便能游刃有餘地應對各種查詢場景。