首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

LINQ to SQL 多條件查詢入門:委托編譯方案與常見誤區解析

     編輯:ASP.NET 基礎

針對中小數據量場景,本文介紹一種相對直觀的 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;
}

調用方式:Expression 編譯為委托

在數據綁定方法中,構建 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();
}

關鍵點與常見坑

  1. 泛型參數寫法:必須寫為 Expression<Func<FeedBack, bool>>,網上部分教程誤寫為 Expression<bool>> 導致編譯失敗。
  2. 性能代價:Compile() 會在運行時生成 IL 代碼,且 Where(expr.Compile()) 導致 LINQ to SQL 無法將邏輯轉譯為 SQL,**會將整表數據拉取到內存後再篩選**,僅適合數據量較小(如幾千條以內)的場景。
  3. 適用邊界:大數據量、高性能要求場景請參考下一篇《表達式樹動態組合方案》。

避坑指南

作者吐槽網上大量複製貼錯誤代碼的現象,提醒初學者:

  • 仔細核對泛型語法,特別是 Expression<Func<T, bool>> 的尖括號嵌套。
  • 理解 IQueryable 與 IEnumerable 的區別:前者支持表達式樹轉 SQL,後者僅支持委托在內存執行。
  • 善用官方文檔與反編譯工具驗證代碼正確性,不要盲目複製博客代碼。

這種「委托編譯」方案雖有性能短板,但邏輯直觀、調試方便,是理解 LINQ 動態查詢的良好切入點。掌握其原理後,再進階學習表達式樹動態組合,便能游刃有餘地應對各種查詢場景。

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