在C#中返回IEnumerable<T>还是IQueryable<T>:有什么区别以及如何选择?
大家好!我是一名初级的C#开发者,正在使用Entity Framework和LINQ。我经常在同事的代码中看到他们从方法中返回`IEnumerable`或`IQueryable`。起初我以为它们是可互换的,但后来我注意到了一些奇怪的行为。
这里有一个例子。我有一个获取订单列表的方法:
```csharp
public IEnumerable GetOrders()
{
using (var db = new MyDbContext())
{
return db.Orders.Where(o => o.IsActive);
}
}
```
然后我调用它并应用额外的过滤:
```csharp
var orders = GetOrders().Where(o => o.Total > 100).ToList();
```
我期望数据库会执行一个带有两个条件(`IsActive = true AND Total > 100`)的SQL查询,但profiler显示它首先选择了所有活跃的订单,然后`Total`的过滤是在应用程序的内存中进行的!如果订单很多,这会非常慢。
而如果我将返回类型改为`IQueryable`,一切就按预期工作了——SQL中生成了