何时真正使用EF Core从数据库中检索数据?

时间:2019-03-03 13:46:26

标签: c# entity-framework

要检索数据,首先我写了一个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查询的执行时间是否有误?

2 个答案:

答案 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