Avatar ·

在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中生成了