C# 当LINQ应该影响链中以前的调用时,它是如何工作的?(例如mongo/Linq2Sql)
当我使用MongoDB时,LINQ让我感到困惑…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仅返回一个文档 关
(事实上,它也发生在Linq2Sql中)
myCollection.Find(obj=>true)
将运行查询以返回myCollection的所有文档myCollection.Find(obj=>true,new FindOptions(){Limit=1})
显然将运行查询,从myCollection中只返回一个文档myCollection.Find(obj=>true).First()
还将运行查询,从myCollection仅返回一个文档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
表达式生成值序列。