C# 当LINQ应该影响链中以前的调用时,它是如何工作的?(例如mongo/Linq2Sql)

C# 当LINQ应该影响链中以前的调用时,它是如何工作的?(例如mongo/Linq2Sql),c#,mongodb,entity-framework,linq,linq-to-sql,C#,Mongodb,Entity Framework,Linq,Linq To Sql,当我使用MongoDB时,LINQ让我感到困惑… (事实上,它也发生在Linq2Sql中) myCollection.Find(obj=>true)将运行查询以返回myCollection的所有文档 myCollection.Find(obj=>true,new FindOptions(){Limit=1})显然将运行查询,从myCollection中只返回一个文档 myCollection.Find(obj=>true).First()还将运行查询,从myCollection仅返回一个文档 关

当我使用MongoDB时,LINQ让我感到困惑…
(事实上,它也发生在Linq2Sql中)

  • myCollection.Find(obj=>true)
    将运行查询以返回myCollection的所有文档

  • myCollection.Find(obj=>true,new FindOptions(){Limit=1})
    显然将运行查询,从myCollection中只返回一个文档

  • myCollection.Find(obj=>true).First()
    还将运行查询,从myCollection仅返回一个文档

  • 关于#3的问题:对服务器进行了什么查询?
    A.
    .First()
    导致
    .Find()
    方法对服务器执行隐式
    Limit=1
    查询,
    只返回一个文档?(如果是,如何实施?)

    B.
    .Find()
    查询所有文档,然后
    .First()
    只取第一个,然后扔掉其余的?看起来很浪费


    感谢

    首先
    由MongoDB驱动程序提供,它是到
    .Limit(1)
    的快捷方式,并作为对象从服务器读取数据:

    collection.Find(o => true).First();
    // is equivalent to
    collection.Find(o => true).Limit(1);
    
    发送到服务器的查询应为:

    db.collection.find().limit(1)
    

    如果它没有发送该查询或类似查询,这将是MongoDB驱动程序中的一个错误,您可以联系他们并提交一个错误。

    它是由(并依赖)数据库提供程序实现的,可能在数据库上运行(以其本机语言),但不能确定(必须查看源代码)但是提供者应该将其转换为对数据库最有效的查询。在这种情况下,它应该使用entity framework执行隐式
    Limit=1
    ,当您尝试枚举集合时,查询只会发送到服务器。@JeremyLakeman是否是通过整个链传递的同一个“Enumerable”对象?覆盖“大多数”LINQ调用的一个?我的问题是关于之前的电话如何知道以后会有什么电话。。。如果是同一个对象,我想这是合理的。linq函数在
    IQueryable
    上,返回另一个
    IQueryable
    。收集所有描述所需内容的
    LambdaExpression
    s。它获取的是
    IEnumerator
    ,它使后端基于整个
    IQueryable
    表达式生成值序列。