哪些LINQ语句强制Entity Framework从DB返回?

我知道几个LINQ语句将导致EF评估并将结果从DB返回到内存。 .ToList()是一个。 有没有人有完整的声明列表?

不确定……

 .SingleOrDefault() .Union() 

编辑:希望我能接受所有这些答案。 大家的好消息!

这是一个很长的清单 。 他们归结为

 Aggregate All Any Average Contains Count ElementAt ElementAtOrDefault Empty First FirstOrDefault Last LastOrDefault LongCount Max Min SequenceEqual Single SingleOrDefault Sum ToArray ToDictionary ToList ToLookup 

其余的是延迟流式执行或延迟非流式执行。

根据您的问题, SingleOrDefault()是立即执行,而Union()是延迟流执行。

任何返回具体对象或数据结构( CountSum SingleFirstToListToArray等)的东西都会立即被评估,因此SingleOrDefault肯定SingleOrDefault

返回IQueryableSelectGroupByTake )的任何内容都将被延迟(以便操作可以链接),因此Queryable.Union将被延迟。

返回IEnumerable任何内容将被延迟,但后续查询将在Linq-to-objects中完成,因此后续操作将不会转换为SQL。 ( Empty是一个例外,因为没有什么可以推迟 – 它只返回一个空集合)

来自MSDN ,

在一系列源元素上执行聚合函数的查询必须首先遍历这些元素。

此类查询的示例包括CountMaxAverageFirst 。 这些执行时没有显式的foreach语句,因为查询本身必须使用foreach才能返回结果。

另请注意,这些类型的查询返回单个值,而不是IEnumerable集合。

要强制立即执行任何查询并缓存其结果,可以调用ToList ToArray 方法。

在Entity Framework的情况下,有一种简单的方法来刷新你的记忆。

entity framework具有System.Data.Entity定义的所有此类方法的Async变体,因为Async对其他人没有意义,因为它是查询数据库的Async变体异步执行的行为。

因此,如果存在Async变体,则它会命中数据库,否则不会。

枚举或生成IEnumerable虽然是一个部分案例:获取IEnumerable获取其枚举器的行为(如在foreach块开始时发生的那样)不会命中数据库,而是第一个MoveNext() (它在foreach中立即发生,它确实命中了数据库,然后它继续从结果集流,直到MoveNext()返回false(就像foreach到达“自然”结束时)或者枚举器被放置在那之前(如当foreach被中止时)。