返回IQueryable<T>
有什么区别?与 IEnumerable<T>
, 什么时候应该优先选择一个?
IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
两者都会被延迟执行吗?什么时候应该优先执行一个?
最佳答案
是的,两者都会给你deferred execution .
区别在于 IQueryable<T>
是允许 LINQ-to-SQL(实际上是 LINQ.-to-anything)工作的接口(interface)。因此,如果您进一步细化对 IQueryable<T>
的查询,如果可能,该查询将在数据库中执行。
对于 IEnumerable<T>
在这种情况下,它将是 LINQ-to-object,这意味着所有与原始查询匹配的对象都必须从数据库加载到内存中。
在代码中:
IQueryable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
该代码将执行 SQL 以仅选择黄金客户。另一方面,下面的代码将执行数据库中的原始查询,然后过滤掉内存中的非金牌客户:
IEnumerable<Customer> custs = ...;
// Later on...
var goldCustomers = custs.Where(c => c.IsGold);
这是一个非常重要的区别,正在研究 IQueryable<T>
在许多情况下可以避免从数据库返回太多行。另一个主要示例是进行分页:如果您使用 Take
和 Skip
在 IQueryable
, 你只会得到请求的行数;在 IEnumerable<T>
上这样做将导致所有行都加载到内存中。
关于c# - 返回 IEnumerable<T> 与 IQueryable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876616/