选择 IEnumerable 当:
1、数据已在内存中
// 数据来自内存集合
List<User> users = GetUsersFromMemory();
var result = users.Where(u => u.Age > 18); // 使用 IEnumerable
2、需要立即执行查询
var users = dbContext.Users.ToList() // 立即执行
.Where(u => u.Age > 18); // 在内存中过滤
3、使用LINQ to Objects功能
// 使用.NET方法而非SQL可翻译的方法
var result = users.Where(u => u.Name.Contains("John"))
.AsEnumerable() // 切换到内存操作
.Select(u => new { u.Name, Initial = u.Name[0] });
选择 IQueryable 当:
1、需要数据库端过滤
// 查询被转换为SQL并在数据库执行
var result = dbContext.Users
.Where(u => u.Age > 18) // 生成 SQL: WHERE Age > 18
.OrderBy(u => u.Name);
2、需要分页或聚合操作
// 只在数据库获取需要的记录
var pagedResult = dbContext.Users
.Where(u => u.IsActive)
.Skip(20).Take(10) // 生成分页SQL
.ToList();
3、构建动态查询
复制代码
IQueryable<User> query = dbContext.Users;
if (!string.IsNullOrEmpty(searchName))
query = query.Where(u => u.Name.Contains(searchName));
if (minAge.HasValue)
query = query.Where(u => u.Age >= minAge.Value);
var finalResult = query.ToList(); // 单一SQL查询
复制代码
性能提示💡错误用法:❌
// 这将加载整个表到内存!
var users = dbContext.Users.ToList()
.Where(u => u.Age > 18);
正确用法:✅
// 只在数据库查询需要的记录
var users = dbContext.Users
.Where(u => u.Age > 18)
.ToList();
总结