0

0

c# ienumerable 和 ilist 和 iqueryable 的区别

月夜之吻

月夜之吻

发布时间:2025-12-27 01:57:23

|

371人浏览过

|

来源于php中文网

原创

该用 IList 时是需立刻加载全部数据并反复索引、修改或统计;它代表已执行查询的可变内存列表,支持 Count、索引器和增删操作,而 IQueryable 和 IEnumerable 不支持。

c# ienumerable 和 ilist 和 iqueryable 的区别

什么时候该用 IList?——需要立刻拿到全部数据并反复操作

当你明确知道后续要多次访问、修改、索引(比如 list[5])、统计数量(Count)或增删元素时,IList 是最直接的选择。它代表一个「已加载到内存的、可变的列表」。

  • 调用 .ToList().ToArray() 后得到的就是 IList(或 List),此时数据库查询已执行完毕,后续所有操作都在内存中进行,不连库
  • 支持 Count 属性、Insert()RemoveAt()[index] 索引器 —— IEnumerableIQueryable 都不支持这些
  • ⚠️ 坑:如果从 EF Core 的 DbSet 直接赋值给 IList 变量但没调用 ToList(),编译会报错 —— 因为 DbSet 默认是 IQueryable,不能隐式转成 IList

IQueryableIEnumerable 看起来都能写 .Where(),到底差在哪?

表面一样,底层完全两回事:一个是「把条件发给数据库执行」,一个是「把全部数据拉到内存再筛」。

  • IQueryable 本质是表达式树(Expression>),EF Core 会把它翻译成 SQL —— .Skip(10).Take(20) 就是 OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY
  • IEnumerable 是纯内存操作,调用 .AsEnumerable() 后,后续所有 LINQ 方法(包括 WhereOrderBySkip)都在客户端执行 —— 即使你只想要第 11 条,也会先把全表查出来
  • 常见错误:
    var posts = context.Posts.AsEnumerable().Where(p => p.Status == "Published").Skip(10).Take(10);
    这句实际执行的是「查全表 → 内存过滤 → 内存分页」,性能灾难

为什么不能把 IQueryable 当作 IList 直接传参?

因为它们生命周期和语义完全不同:一个是「还没执行的查询计划」,一个是「已落地的内存对象」。

企业黄页-大众投资指南整站 asp.net 2.0
企业黄页-大众投资指南整站 asp.net 2.0

大众投资指南是基于Asp.Net(2.0)+C#+Access(sql2000)的企业黄页类程序,是基于web2.0 模式的网站。 贴吧和黄页都有采集功能 主程序包括分类信息和商家黄页两大模块。分类信息支持二级分类,商家黄页支持二级地区分类及二级行业分类。程序采用了伪静态(url重写)技术,可选生成纯静态首页。 一、分类信息仿百度贴吧编写,可以分别对游客及会员设置不同的审核条件。会员发布信息

下载
  • 如果你写一个方法接收 IList 参数,却传入 IQueryable,编译直接失败 —— 它们没有继承关系(IQueryable 继承自 IEnumerable,不是 IList
  • 更隐蔽的问题:把 IQueryable 存进字段或返回给上层,却在多个地方反复遍历(比如两个 foreach),会导致同一查询执行两次 —— 数据可能已变,还浪费连接资源
  • 正确做法:如需复用结果,先 .ToList() 落地;如需保持查询能力,就用 IQueryable,但确保只执行一次(比如最后统一 ToListAsync()

选型口诀:查库用 IQueryable,算数用 IEnumerable,干活用 IList

这不是教条,而是对应三种真实动作:

  • IQueryable:还在和数据库「商量怎么查」—— 只做 WhereOrderByJoin 这类能转 SQL 的操作
  • IEnumerable:数据已在本地,但你只想「读一遍」—— 比如日志聚合、DTO 映射、简单过滤,且不关心索引或修改
  • IList:你要「真动手改」—— 插入新项、按位置删、反复查长度、导出 Excel、绑定 WinForms DataGridView

最容易被忽略的一点:IQueryable 的延迟执行是「表达式树级」的,一旦混入 IEnumerable 操作(比如 .Select(x => new { x.Id, Name = x.Title.ToUpper() }) 中用了非 SQL 友好方法),EF Core 会自动截断翻译,提前把部分数据拉进内存再继续 —— 日志里会出现「Client evaluation」警告,性能拐点往往就在这里。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

673

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

344

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1082

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

671

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

563

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

406

2024.04.29

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 9.6万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号