c# - 返回 IEnumerable<T> 与 IQueryable<T>

标签 c# linq linq-to-sql ienumerable iqueryable

返回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/

相关文章:

.net - 将 LINQ 数据上下文和非 linq 存储过程包装到事务中?

c# - 是否有可能以强类型方式调用泛型方法,同时保持在编译时推断类型的能力?

c# - 有什么方法可以实现 'is'/'as' 动态或至少伪造它?

c# - Entity Framework 中的可查询 Linq 查询差异

.net - Linq to SQL - 返回前 n 行

c# - 使用 LINQ 减去表中的列

c# - 无法清除组合框中的选择

c# - xUnit - 测试是否抛出两个不同异常之一

c# - List inside 其他列表性能

c# - LINQ 搜索特定字符串的字符串数组列表