加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 多次调用ToList会影响性能吗?

发布时间:2020-12-15 23:47:11 所属栏目:百科 来源:网络整理
导读:我经常看到调用ToList会使查询每次都执行.我有点困惑.那么在这种情况下,第二次调用ToList会使查询多次执行吗?在什么情况下查询会多次执行? //This gets from database and ToList is already called hereListCustomer Customers = GetCustomersFromDataBas
我经常看到调用ToList会使查询每次都执行.我有点困惑.那么在这种情况下,第二次调用ToList会使查询多次执行吗?在什么情况下查询会多次执行?

//This gets from database and ToList is already called here
List<Customer> Customers = GetCustomersFromDataBase();

//ToList is called here again
List<Customer> FilteredCustomers = (from c in Customerswhere c.id == 1c).ToList();

编辑

我刚刚提供了这个代码示例来了解ToList真正做了什么.我没有这样实现它.
此外,我进行存储过程调用以从db返回客户,并从返回的数据表创建客户列表.

解决方法

在IQueryable上调用ToList(或ToArray,AsEnumerable等)将执行查询.之后,您使用的任何LINQ表达式都将在内存列表中运行.

例如,您的代码:

List<Customer> Customers = GetCustomersFromDataBase();

这将生成一个表示数据库记录的Customer对象列表.该列表现在独立于用于从数据库获取结果的查询,但仍需要从数据库中获取Customer对象中的链接记录.

然后当你这样做:

List<Customer> FilteredCustomers = (from c in Customers where c.id == 1c).ToList();

这不是在数据库上运行,而是在从前一个语句返回的内存结果中运行.在这种情况下,您不会多次查询数据库.

影响性能的地方就是当你有一个IQueryable对象,你直接多次调用ToList.在IQueryable上对ToList的每次调用都将导致对数据库的调用,所有的伴随对象跟踪都在后台进行.通常,这是您要避免的,尽管在枚举结果之前对查询进行额外过滤可能会导致更好的性能,如果查询选择的记录总数很大并且过滤器会拉取数据的小子集.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读