编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

IEnumerable
特点
应用场景
例子
IQueryable
特点
应用场景
例子
总结
选择指南

在C#中进行数据处理时,IEnumerableIQueryable是两个非常重要的接口。它们提供了延迟执行和查询操作,但有着不同的工作方式和应用场景。

IEnumerable

特点

  1. 延迟执行:IEnumerable 也是延迟执行。当对 IEnumerable 进行操作时,它会在实际迭代时才执行查询。
  2. 内存中操作:所有操作和过滤在内存中完成。这意味着数据已经被加载到内存中。
  3. 适用于内存数据:通常用于处理内存中的集合,如 List、Array 等。
  4. 无查询优化:由于在内存中操作,没有查询优化。

应用场景

  • 对已经加载到内存中的数据进行操作和查询。
  • 不需要对大数据集进行过滤或分页,只需对小数据集合进行处理。

例子

C#
using System; using System.Collections.Generic; class Program { static void Main() { IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0); foreach (var num in evenNumbers) { Console.WriteLine(num); } } }

image.png

在这个例子中,numbers.Where(n => n % 2 == 0)是一个延迟执行操作,只有在 foreach 循环中实际迭代时才会执行。

IQueryable

特点

  1. 延迟执行:IQueryable 也是延迟执行,只有在实际查询时才执行。
  2. 查询优化:它能将表达式树(expression tree)转换为适当的查询语言(如SQL),并且在数据源上执行查询,这通常由 LINQ 提供程序负责。
  3. 适用于远程数据源:比如数据库。IQueryable 用于将查询发送到数据源,而不是将数据加载到内存中。
  4. 减少内存占用:只提取需要的数据到内存中,优化性能。

应用场景

  • 对大数据集进行操作(如数据库查询)。
  • 需要对数据源进行优化查询以提高性能。
  • 在实体框架 (Entity Framework) 等ORM工具中常用。

例子

Nuget 安装

C#
Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Sqlite
C#
using System; using System.Linq; using Microsoft.EntityFrameworkCore; class Program { static void Main() { // 配置数据库选项,使用SQLite的内存数据库 var options = new DbContextOptionsBuilder<MyDbContext>() .UseSqlite("DataSource=:memory:") .Options; using (var context = new MyDbContext(options)) { context.Database.OpenConnection(); context.Database.EnsureCreated(); // Seed the database SeedDatabase(context); IQueryable<Employee> query = context.Employees.Where(e => e.Age > 30); foreach (var employee in query) { Console.WriteLine($"{employee.Name} ({employee.Age})"); } } } static void SeedDatabase(MyDbContext context) { context.Employees.AddRange( new Employee { Name = "Alice", Age = 25 }, new Employee { Name = "Bob", Age = 35 }, new Employee { Name = "Charlie", Age = 40 } ); context.SaveChanges(); } } public class Employee { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class MyDbContext : DbContext { public DbSet<Employee> Employees { get; set; } public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } }

在这个例子中,context.Employees.Where(e => e.Age > 30)将生成SQL查询并在数据库服务器端执行。

image.png

总结

特性IEnumerableIQueryable
延迟执行
工作方式在内存中操作将查询发送到数据源优化执行,以最少数据传输
适合数据源内存数据(如 List、Array 等)远程数据源(如数据库)
查询优化
使用场景小数据集,已加载到内存的数据大数据集,需对数据源进行复杂查询

选择指南

  • 如果你的数据已经在内存中,并且数据量较小,且不需要复杂的查询优化,IEnumerable 是最佳选择。
  • 如果你的数据在远程数据源中,并且你需要对数据源进行复杂的查询操作,IQueryable 更加合适。

这两个接口在不同场景下各自有着明显的优势,理解它们的区别和应用场景对于高效的数据处理至关重要。希望本文对你了解 IEnumerableIQueryable 的区别有所帮助。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!