當前位置: 妍妍網 > 碼農

IEnumerable 與 IQueryable:為工作選擇正確的工具

2024-03-18碼農

概述: 在 C# 編程中,了解 和 之間的區別對於編寫高效且高效能的程式碼至關重要。這兩個介面在處理集合時都發揮著重要作用,但它們具有不同的特性,使其適用於不同的方案。在本文中,我們將深入探討 和 的技術細節,探索它們的差異,並提供真實世界的範例來說明何時使用一個而不是另一個。IEnumerableIQueryableIEnumerableIQueryable了解 IEnumerable:IEnumerable是 C# 中的基本介面,表示集合的只進遊標。它屬於名稱空間,並提供了一種迴圈存取項集合的通用方法。它適用於記憶體中的集合,如陣列、列表和其他可列舉數據結構。System.CollectionsIEn

在 C# 編程中,了解 和 之間的區別對於編寫高效且高效能的程式碼至關重要。這兩個介面在處理集合時都發揮著重要作用,但它們具有不同的特性,使其適用於不同的方案。在本文中,我們將深入探討 和 的技術細節,探索它們的差異,並提供真實世界的範例來說明何時使用一個而不是另一個。IEnumerableIQueryableIEnumerableIQueryable

了解 IEnumerable:

IEnumerable是 C# 中的基本介面,表示集合的只進遊標。它屬於名稱空間,並提供了一種迴圈存取項集合的通用方法。它適用於記憶體中的集合,如陣列、列表和其他可列舉數據結構。System.Collections

IEnumerable的特征:

1. 立即執行:

當您對集合執行操作時,這些操作將立即執行。IEnumerable

IEnumerable<int> numbers = GetNumbers();
// Execution is immediate
var filteredNumbers = numbers.Where(n => n > 10).ToList();

2. 客戶端過濾:

篩選、排序和其他操作是在檢索整個數據集後在客戶端完成的。

IEnumerable<string> names = GetNames();
// Filtering on the client side
var filteredNames = names.Where(name => name.StartsWith("A")).ToList();

3. 記憶體處理:

所有數據都載入到記憶體中,使其適用於小型到中等大小的集合。

IEnumerable<Product> products = GetProducts();
// In-memory processing
var expensiveProducts = products.Where(p => p.Price > 100).ToList();

了解 IQueryable:

IQueryable是名稱空間的擴充套件,並且是名稱空間的一部份。它表示可以使用查詢提供程式對特定資料來源(如資料庫)執行的查詢。在處理大型數據集和遠端資料來源時特別有用。IEnumerableSystem.LinqIQueryable

IQueryable的特點:

1. 延期執行:

不會立即執行 上的操作。當實際需要數據時執行查詢,從而允許延遲執行。IQueryable

IQueryable<Product> products = dbContext.Products;
// Execution is deferred
var expensiveProducts = products.Where(p => p.Price > 100).ToList();

2. 伺服器端過濾:

篩選和其他操作將轉換為在伺服器端執行的查詢,從而最大程度地減少數據傳輸。

IQueryable<Employee> employees = dbContext.Employees;
// Filtering on the server side
var highSalaryEmployees = employees.Where(emp => emp.Salary > 50000).ToList();

3. 針對外部資料來源進行了最佳化:

IQueryable旨在有效地處理外部資料來源(如資料庫),其中繁重的工作在源頭完成。

IQueryable<Customer> customers = dbContext.Customers;
// Optimized for database queries
var selectedCustomers = customers.Where(c => c.Country == "USA").ToList();

在 IEnumerable 和 IQueryable 之間進行選擇:

在以下情況下使用 IEnumerable:

  • 處理記憶體中集合。

  • 對小型到中等大小的數據集執行操作。

  • 立即執行是可以接受的,效能不是關鍵問題。

  • 在以下情況下使用 IQueryable:

  • 查詢大型數據集,尤其是在處理資料庫等外部資料來源時。

  • 需要最佳化查詢以在伺服器端執行。

  • 延遲執行是可取的,效能是一個關鍵考慮因素。

  • 真實世界的例子:

    讓我們透過一些真實世界的範例來理解 IEnumerable 和 IQueryable

    IEnumerable 範例:

    在此範例中,我們有一個由 表示的記憶體中書籍集合。例如,該方法可以從本地資料庫或任何其他記憶體資料來源中檢索書籍列表。IEnumerable<Book> booksGetBooks()

    以下行演示了 for immediate execution 的用法。我們使用擴充套件方法過濾書籍以僅包含屬於「幻想」型別的書籍。呼叫該方法可立即實作結果。IEnumerableWhereToList()

    此方法適用於處理小型到中等大小的集合,其中可以將整個數據集載入到記憶體中,而不會對效能產生重大影響。

    // In-memory collection of books
    IEnumerable<Book> books = GetBooks();
    // Immediate execution of filtering on the client side
    var fantasyBooks = books.Where(b => b.Genre == "Fantasy").ToList();

    IQueryable 範例:

    在此範例中,我們將使用表示資料庫上下文 ()。該內容可以是關聯式資料庫中的表,並且是實體框架 DbContext 或類似的 ORM(物件關系對映)上下文。IQueryable<Order>dbContextOrdersdbContext

    與 不同,操作不會立即執行。過濾條件()被轉換為伺服器端查詢,實際執行發生在需要數據時(在本例中為呼叫)。IEnumerableIQueryableo => o.TotalAmount > 1000ToList()

    在處理大型數據集或遠端資料來源(如資料庫)時,這種延遲執行非常有用。過濾在伺服器端執行,最大限度地減少透過網路傳輸的數據量並最佳化效能。

    // IQueryable representing a database context
    IQueryable<Order> orders = dbContext.Orders;
    // Deferred execution of filtering, translated into a server-side query
    var highValueOrders = orders.Where(o => o.TotalAmount > 1000).ToList();

    結論:

    總之,了解何時使用 和 對於在 C# 中編寫高效和最佳化的程式碼至關重要。雖然適用於記憶體中收集和即時執行,但在處理大型數據集和遠端資料來源時大放異彩,提供延遲執行和伺服器端最佳化。為工作選擇合適的工具最終將帶來更好的效能和響應速度更快的應用程式。

    如果你喜歡我的文章,請給我一個贊!謝謝