c# - IQueryable 和 AsEnumerable():延迟执行与立即执行
问题描述
可以AsEnumerable()
从 中删除GetCars
,并且GetCars
仍然是延迟执行?
public IEnumerable<Car> GetCars(string id)
{
IEnumerable<Car> cars = IDocumentClient.CreateDocumentQuery<Car>(link).AsEnumerable();
return cars.Where(r => r.Id == Id);
}
如下所示:
//GetCars2 is still deferred execution?
public IEnumerable<Car> GetCars2(string Id)
{
IOrderedQueryable<Car> cars = IDocumentClient.CreateDocumentQuery<Car>(link)
return cars.Where(r => r.Id == .Id);
}
更新
我希望首先在数据库中完成所有过滤,从而减少返回的数据。
另外,我在调用GetCar()
. UsingIEnumerable
允许延迟执行以过滤GetCar()
.
可以IQueryable
代替吗?有什么好处?
GetCars3 中的过滤是否也考虑用于 SQL 查询(GetCar2 和 GetCar3)?因此,这两种方法都减少了从数据库返回的数据?
public IEnumerable<Car> GetCars3(string Model )
{
return GetCars2(id).Where(r => r.Model == Model);
}
更新2
正如mjwills
建议使用 IQueryable 作为 GetCarX() 的返回类型。但我不明白为什么。因为使用 IEnumerable<> 仍然具有所有好处。也就是说,文件过滤是在数据库端执行的,而不是 C#。如果我错了,请纠正我。
返回 IEnumerable<T> 与 IQueryable<T>
LINQ 提供者:
https://azure.microsoft.com/en-us/blog/azure-documentdb-s-linq-provider-just-got-better/
读取查询: 当我只需要计数而不读取 Document-Db 数据库中的所有文档时,如何使用 Linq 构造 IQueryable 查询?
https://github.com/Azure/azure-cosmos-dotnet-v2/issues/58
当我只需要计数而不读取 Document-Db 数据库中的所有文档时,如何使用 Linq 构造 IQueryable 查询?
SQL:https ://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-getting-started#linq-to-documentdb-sql
更新 3
这个问题与 AsEnumerable() 有关,它在Where
定义的同一函数中使用,作为don't it
.
它与以前的帖子有细微的差别,在这篇文章中更明确地解释了这一点。
因此,不应将此帖子标记为重复。
解决方案
在您的两个示例中,它们都将使用延迟执行运行 - 在迭代IQueryable
or之前,它们不会将基础查询发送到服务器。IEnumerable
GetCars
和之间的区别GetCars2
仅在于,当它的结果GetCars
最终被其调用者枚举时,Where
谓词中的子句将在客户端上运行-当可迭代中的每个结果从服务器经过时,都会对其进行评估并返回或丢弃;与 in GetCars2
(如果特定实现IQueryable
支持它)相比,Where
谓词将被考虑到发送到服务器的查询中。如果IQueryable
return from的实现CreateDocumentQuery
不支持方法链来构造查询,那么它们将以相同的方式工作。但是在任何一种情况下,它们都使用延迟执行,因为在实际枚举方法的结果之前,不会将任何内容发送到服务器。
响应添加到问题的更新 - 将其AsEnumerable()
视为门功能。它切断了IQueryable
将要与服务器通信的对象与您在其后添加的任何其他 LINQ 类型方法之间的通信。对IQueryable
之后发生的事情视而不见AsEnumerable
。因此,如果您想使用方法链编写服务器端查询,请不要使用AsEnumerable
.
推荐阅读
- mysql - 如何在一个脚本中同时执行 MySQL 查询和 bash 命令?
- dynamics-crm - 实体上的汇总字段多久重新计算一次?
- html - 有没有办法指定相对边框宽度和最小内容宽度?
- java - 从未知字符串中检索枚举值
- html - 未为 document.querySelector 定义文档
- amazon-web-services - 诊断 AWS 应用程序负载均衡器的缓慢响应时间
- swift - 如何在spritekit tilemap中设置tileset的不透明度?
- matlab - 如何以矢量化方式从matlab中的TSP距离矩阵计算所有行程的长度
- html - 如何删除div元素之间的空间?
- r - 在 R Shiny 中操作用户上传的文件/数据