在C#中进行数据处理时,IEnumerable
和IQueryable
是两个非常重要的接口。它们提供了延迟执行和查询操作,但有着不同的工作方式和应用场景。
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);
}
}
}
在这个例子中,numbers.Where(n => n % 2 == 0)
是一个延迟执行操作,只有在 foreach
循环中实际迭代时才会执行。
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查询并在数据库服务器端执行。
特性 | IEnumerable | IQueryable |
---|---|---|
延迟执行 | 是 | 是 |
工作方式 | 在内存中操作 | 将查询发送到数据源优化执行,以最少数据传输 |
适合数据源 | 内存数据(如 List、Array 等) | 远程数据源(如数据库) |
查询优化 | 无 | 有 |
使用场景 | 小数据集,已加载到内存的数据 | 大数据集,需对数据源进行复杂查询 |
IEnumerable
是最佳选择。IQueryable
更加合适。这两个接口在不同场景下各自有着明显的优势,理解它们的区别和应用场景对于高效的数据处理至关重要。希望本文对你了解 IEnumerable
和 IQueryable
的区别有所帮助。
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!