我经常看到调用 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();
Edit
我只是提供了这个代码示例来了解 ToList 的真正用途。我不会以这种方式实现它。
此外,我还进行存储过程调用以从数据库返回客户,并从返回的数据表创建客户列表。
Calling ToList
(or ToArray
, AsEnumerable
等)上IQueryable
将执行查询。此后,您使用的任何 LINQ 表达式都将在内存列表上进行操作。
例如,您的代码:
List<Customer> Customers = GetCustomersFromDataBase();
这将导致List
of Customer
代表数据库记录的对象。该列表现在独立于用于从数据库获取结果的查询,尽管链接记录在Customer
仍然需要从数据库中获取对象。
然后当你这样做时:
List<Customer> FilteredCustomers = (from c in Customers where c.id == 1c).ToList();
这不是对数据库进行操作,而是对上一条语句返回的内存中的结果进行操作。在这种情况下,您将不会多次查询数据库。
在哪里does影响绩效是指当你有一个IQueryable
你调用的对象ToList
直接上多次。每次致电ToList
on an IQueryable
将导致对数据库的调用,并在后台进行所有伴随的对象跟踪等。一般来说,这是您想要避免的事情,尽管如果查询选择的记录总数很大并且过滤器提取数据的小子集,则在枚举结果之前对查询进行额外过滤可能会带来更好的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)