Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDb驱动程序c#查询优化_C#_Mongodb_Performance_Linq - Fatal编程技术网

MongoDb驱动程序c#查询优化

MongoDb驱动程序c#查询优化,c#,mongodb,performance,linq,C#,Mongodb,Performance,Linq,我在mongo db文档中读到,我也可以使用LINQ,但我不了解关于它的一些事情 例如,如果我写: var result = collection.Find(filter); 及 什么更好 基于整个集合的LINQ过滤器? 在我得到整个收藏然后过滤之前?或者在筛选之前,它会给我已经筛选过的集合?两者的作用基本相同 LINQAPI是集合API的包装器 从简单研究的源代码中,我可以看到LINQ版本调用或。它基于LINQ表达式构造在query参数中传递的IMongoQuery。为此,它使用查询生成器A

我在mongo db文档中读到,我也可以使用LINQ,但我不了解关于它的一些事情

例如,如果我写:

var result = collection.Find(filter);

什么更好

基于整个集合的LINQ过滤器?
在我得到整个收藏然后过滤之前?或者在筛选之前,它会给我已经筛选过的集合?

两者的作用基本相同

LINQAPI是集合API的包装器

从简单研究的源代码中,我可以看到LINQ版本调用或。它基于LINQ表达式构造在
query
参数中传递的
IMongoQuery
。为此,它使用查询生成器API(类),例如

什么更好

视情况而定

  • 如果您在C#代码中有表示数据库中文档结构的类型,那么您可能会受益于LINQAPI。您将受益于强类型、更好的可读性,并且不会错过名称作为字符串传递的重命名标识符
  • 如果您有动态的数据结构,它在代码中没有具体的表示(您有关于文档的某种元数据,但没有显式包含文档属性的
    )。在这种情况下,使用LINQ将是一场斗争,而原始收集API将是更好的选择
    
基于整个集合的LINQ过滤器?在我得到整个收藏然后过滤之前?或者在筛选之前,它会给我已经筛选过的集合

由于LINQ API实现的是
IQueryable
,而不仅仅是
IEnumable
,因此所有可枚举方法(例如
Where
OrderBy
)实际上都不会被调用,而是在编译期间被转换为构建表达式树的代码。在运行时,构建表达式树并将其传递给底层查询提供程序(在本例中由MongoDB驱动程序实现)。查询提供程序将表达式树转换为常规MongoDB查询,并通过常规MongoDB API执行它们

有关更多详细信息,请参阅

因此,查询实际上是在数据库中执行的,只有经过处理(过滤、排序或投影)的结果才会返回给应用程序

然而,使用LINQ API意味着一些性能开销,因为除了运行查询之外,LINQ API还:

  • 构建表达式树以将其传递给查询提供程序
  • 访问表达式树以将其转换为本机查询

在许多情况下,这种开销是可以忽略的,但这取决于您的需求。

LINQ应该转换为Mongo查询。LINQ对于C#developer来说更具可读性,但与MongoDB find命令相比,它会带来一些性能问题。对于性能,我更喜欢Find()命令而不是linq命令。
var result = collection.AsQueryable()
              .Where(x => x.Foo == 114)