【发布时间】:2019-12-05 05:56:12
【问题描述】:
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() 后进行了更多过滤。使用IEnumerable 允许延迟执行以过滤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#。如果我错了,请纠正我。
Returning IEnumerable<T> vs. IQueryable<T>
LINQ 提供者:
https://azure.microsoft.com/en-us/blog/azure-documentdb-s-linq-provider-just-got-better/
https://github.com/Azure/azure-cosmos-dotnet-v2/issues/58
SQL:https://docs.microsoft.com/en-gb/azure/cosmos-db/sql-query-getting-started#linq-to-documentdb-sql
更新 3
本题与AsEnumerable()有关,在定义Where的同一函数中使用,以don't it为例。
它与之前的帖子有细微的差别,在这篇文章中更明确地解释了这一点。
因此,不应将此帖子标记为重复。
【问题讨论】:
-
添加
AsEnumerable不会使其“立即执行”。这只是意味着后续过滤等将是客户端(即在 C# 中)。作为一般规则,如果是IQueryable,那么请尽量将其保留在IQueryable。 -
但我认为
CreateDocumentQuery<Car>(link)在调用 'AsEnumerable()' 之前不会发送查询。 -
我希望所有的过滤都先在数据库中完成,从而减少返回的数据。
-
使用
AsEnumerable几乎肯定不会给你任何有用的东西。我建议使用IQueryable。如果GetCars返回IQueryable,则可以进行进一步过滤(它可以发生在服务器端,而不是在C# 中(如果您使用AsEnumerable,它将在下载所有记录后进行C# 过滤)。 -
请参阅更新 3 以重新打开帖子。
标签: c# azure-cosmosdb azure-cosmosdb-sqlapi