要检索数据,首先我写了一个LINQ
查询,我希望在调用FirstAsync()
方法之前不要在数据库上执行该查询。
var query =
from tkn in Db.Set<TableA>()
where tkn.IsActive == true
where tkn.Token == token
select tkn.RelatedObjectMappedToTableB;
var retrievedObject = await clientQuery.FirstAsync();
问题是,我在调试时可以在Visual Studio的Watch
中看到相关对象的值,在到达{{1 }}
对我来说,这意味着数据库已经被查询,EF直到我要求它时才等待。
为什么这样做?我对 linq查询的执行时间是否有误?
答案 0 :(得分:4)
对我来说,这意味着数据库已经被查询,并且ef直到我要求它时才等待。
不,正在精确查询数据库,因为您要求这样做。
我对linq查询何时执行有误吗?
不是,不是
为什么这样做?
LINQ以惰性方式检索值,这意味着它一直等到您对它执行一些枚举。使用Visual Studio的“监视窗口”要求对查询进行评估,以便您可以查看实际详细信息。
答案 1 :(得分:0)
LINQ支持两种执行行为:延迟执行和立即执行。延迟执行意味着将对表达式的求值延迟到实际需要其实现值为止。通过避免不必要的执行,大大提高了性能。
延迟执行适用于任何内存中集合以及远程LINQ提供程序,例如LINQ-to-SQL,LINQ-to-Entities,LINQ-to-XML等。
在所提供的示例中,查询似乎在where
执行,但这实际上并没有发生。调用时执行的查询
.FirstAsync()
,这意味着您确实需要数据,并且C#执行查询,提取数据并将数据存储到内存中。
如果要立即执行操作,可以使用.ToList()
,它将提取完整的投影数据并保存到内存中。
var result =(from tkn in Db.Set<TableA>()
where tkn.IsActive == true
& tkn.Token == token
select tkn.RelatedObjectMappedToTableB).ToList();
有关更多详细信息,请参见article