Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的區別和用法

来源:https://www.cnblogs.com/codedisco/archive/2023/09/17/17708382.html
-Advertisement-
Play Games

當使用LINQ查詢數據時,我們常常會面臨選擇使用.AsEnumerable(), .AsQueryable(), 和 .ToList()方法的情況。這些方法在使用時有不同的效果和影響,需要根據具體場景來選擇合適的方法 .AsEnumerable()方法: 使用.AsEnumerable()方法可以將 ...


當使用LINQ查詢數據時,我們常常會面臨選擇使用.AsEnumerable(), .AsQueryable(), 和 .ToList()方法的情況。這些方法在使用時有不同的效果和影響,需要根據具體場景來選擇合適的方法

.AsEnumerable()方法:

  • 使用.AsEnumerable()方法可以將查詢結果從資料庫轉換為IEnumerable類型,從而在記憶體中進行延遲載入和更多的Linq操作。
  • 這種方法適用於當我們需要在記憶體中對查詢結果進行進一步處理,如過濾、排序等操作。
  • 優點:可以在記憶體中進行更多的Linq操作,靈活性較高。
  • 缺點:查詢結果在記憶體中會占用較大的空間,對於大數據量的情況可能會導致性能問題。
    var electronicProducts = dbContext.Products
        .Where(p => p.Category == "Electronics")
        .AsEnumerable()
        .Select(p => new { p.Id, p.Name });
    foreach (var product in electronicProducts)
    {
        Console.WriteLine($"{product.Id} - {product.Name}");
    }

.AsQueryable()方法:

  • 使用.AsQueryable()方法可以將查詢結果從資料庫轉換為IQueryable類型,從而進行資料庫查詢優化。
  • 這種方法適用於當我們需要在資料庫中對查詢結果進行進一步篩選,從而避免在記憶體中載入不必要的數據。
  • 優點:可以使用資料庫查詢優化,避免在記憶體中載入所有數據。
  • 缺點:不能在記憶體中進行所有Linq操作,因為有些操作資料庫不支持。
var cheapProducts = dbContext.Products
    .Where(p => p.Price < 100)
    .AsQueryable()
    .OrderBy(p => p.Price);

foreach (var product in cheapProducts)
{
    Console.WriteLine($"{product.Id} - {product.Name} - {product.Price}");
}

.ToList()方法:

  • 使用.ToList()方法會立即查詢資料庫並將結果載入到記憶體中的List集合中,此時數據已經從資料庫中獲取完畢。
  • 這種方法適用於當我們需要立即獲取所有數據,併在記憶體中進行後續操作。
  • 優點:可以立即獲取所有數據,適用於後續需要在記憶體中進行大量操作的場景。
  • 缺點:可能會占用較多的記憶體空間,不適合大數據量的情況。
var allProducts = dbContext.Products.ToList();

foreach (var product in allProducts)
{
    Console.WriteLine($"{product.Id} - {product.Name} - {product.Price}");
}

總結:

  1. 使用.AsEnumerable()方法適合需要在記憶體中進行靈活的Linq操作的情況,但需要註意記憶體占用問題。
  2. 使用.AsQueryable()方法適合需要在資料庫中進行優化查詢的情況,避免不必要的數據載入。
  3. 使用.ToList()方法適合需要立即獲取所有數據的情況,但對於大數據量要謹慎使用以避免記憶體問題。

根據具體的業務場景和性能需求,選擇合適的方法能夠提高程式性能並有效地處理數據。

作者:GG 出處:https://www.cnblogs.com/codedisco 本文版權歸作者和博客園共有,歡迎轉載,但必須給出原文鏈接,並保留此段聲明,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註釋可以用來解釋Python代碼。註釋可以用來使代碼更易讀。註釋可以用來在測試代碼時防止執行。 創建註釋 註釋以#開始,Python會忽略它們: 示例:獲取您自己的Python註釋 # 這是一個註釋 print("Hello, World!") 註釋可以放在一行的末尾,Python會忽略行的其餘部分 ...
  • 目錄 線程簡介 線程實現(重點) 線程狀態 線程同步(重點) 線程通信問題 線程實現: 方式一:繼承Thread類 /** * TODO * @author 清蓮孤舟 * @CreateDate 2023/9/17/9:28 * 創建線程的方式一:通過繼承Thread類實現 */ //繼承Threa ...
  • 什麼是 Prometheus Prometheus 是一個開源的系統監控和警報工具,最初由 SoundCloud 開發,並於 2012 年發佈為開源項目。它是一個非常強大和靈活的工具,用於監控應用程式和系統的性能,並根據預定義的規則觸發警報。以下是對 Prometheus 的詳細介紹: 特點和優勢: ...
  • 寫在前面 上一小節中我們從0到1 使用Vite搭建了一個Vue3項目,並集成了Element Plus 實現了一個簡單的增刪改查頁面。 這一篇中我們將使用IDEA快速搭建一個SpringBoot3.x的項目。 一、創建項目 1、File->new->project 2、選擇“Spring Initi ...
  • 超級好用繪圖工具(Draw.io+Github) 方案簡介 繪圖工具:Draw.io 存儲方式: Github 1 Draw.io 1.2 簡介 ​ 是一款免費開源的線上流程圖繪製軟體,可以用於創建流程圖、組織結構圖、網路圖、UML圖等各種類型的圖表。它提供了豐富的圖形元素和編輯功能,使用戶能夠輕鬆 ...
  • 1. IO模型 記憶體和外設的交互叫做IO,網路IO就是將數據在記憶體和網卡間拷貝。 IO本質就是等待和拷貝,一般等待耗時往往遠高於拷貝耗時。所以提高IO效率就是儘可能減少等待時間的比重。 IO模型 簡單對比解釋 阻塞IO 阻塞等待數據到來 非阻塞IO 輪詢等待數據到來 信號驅動 信號遞達時再來讀取或寫 ...
  • 現代軟體應用很少獨立工作。典型的應用程式會與幾個外部系統進行通信,如: 資料庫、 消息系統、 緩存提供商 其他第三方服務。 你應該編寫測試確保一切正常運行。 單元測試有助於隔離地測試業務邏輯,不涉及任何外部服務。它們易於編寫並提供幾乎即時的反饋。 有了單元測試還不夠,集成測試用來驗證與外部系統的交互 ...
  • 創建C#項目且使用.Net6.0以上的版本時,預設code會使用頂級語句形式: 1、略去static void Main(String[ ] args)主方法入口; 2、隱式使用(即隱藏且根據代碼所需要的類自動調用)其他命名空間(包括): using System; using System.IO; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...