Min*_*v 1 3 c# linq performance mongodb
我在mongo db doc中读到,我也可以使用LINQ,但我对此一无所知。
例如,如果我写:
var result = collection.Find(filter);
Run Code Online (Sandbox Code Playgroud)
和
var result = collection.AsQueryable()
.Where(x => x.Foo == 114)
Run Code Online (Sandbox Code Playgroud)
什么是更好的?
LINQ筛选器基于整个集合吗?在获得整个收藏之前,它会进行过滤吗?还是在过滤器之前,它给了我已经过滤的集合?
两者几乎一样。
LINQ API是Collection API的包装。
通过简要研究mongo-csharp-driver的源代码,我可以看到LINQ版本调用了Collection.FindAs(...)或Collection.Distinct(...)。它基于LINQ表达式构造IMongoQuery传入的query参数。为此,它使用查询构建器API(Query类),例如Query.EQ。
什么是更好的?
这取决于。
class显式包含文档属性)。在这种情况下,使用LINQ会很麻烦,原始的Collection API将是一个更好的选择。LINQ筛选器基于整个集合吗?在获得整个收藏之前,它会进行过滤吗?还是在过滤器之前,它给了我已经过滤的集合?
由于LINQ API不仅实现IQueryable了IEnumeable,因此实际上并未调用所有可枚举的方法(例如Where或OrderBy),而是在编译过程中将其转换为生成表达式树的代码。在运行时,将构建表达式树并将其传递给基础查询提供程序(在这种情况下,由MongoDB驱动程序实现)。查询提供程序将表达式树转换为常规的MongoDB查询,并通过常规的MongoDB API执行它们。
有关更多详细信息,请参见如何:使用表达式树构建动态查询。
因此,查询实际上是在数据库中执行的,并且只有已处理(过滤,排序或计划)的结果返回给应用程序。
但是,使用LINQ API会带来一些性能开销,因为LINQ API除了运行查询之外,还:
在许多情况下,这种开销可以忽略不计,但这取决于您的要求。