Aggregate是否存在致命缺陷,因为每个into子句是单独执行的?

Mar*_*urd 12 linq vb.net aggregate aggregate-functions linq-to-sql

Aggregate当用作具有多个Into子句的Linq表达式的第一个(外部)子句时,VB.NET的查询是否存在致命缺陷,因为每个Into子句是单独执行的?

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM PlantLINQ to SQL中的"明显"答案是

Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max()
Run Code Online (Sandbox Code Playgroud)

但是,这个答案实际上在单独的 SQL查询中检索每个MinMax(以及如果包括其他聚合函数,如CountAverage).这可以在LINQPad中轻松看到.

是否存在LINQPad未显示的事务(或其他使这些查询成为原子的事件),或者这是一种等待发生的竞争条件?(因此,您必须执行上述问题的答案中显示的技巧,以强制返回多个聚合的单个查询.)

总之,是否使用LINQ-to-SQL查询Aggregate在单个(或至少"原子")查询中返回多个聚合函数?

(我也说"显而易见",因为对我来说显而易见的答案Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin),实际上检索了整个表两次,即使在优化后,然后使用Linq-to-Entities MinMax获得结果:-()

我认为Aggregate不是特定于VB的,但看起来C#没有这个查询表达式,所以我将更改为.

Mar*_*urd 0

回答我更广泛的问题:Aggregate在没有事务的情况下生成单独的 SQL 查询是否会被破坏?

所有 LINQ 都可能导致,如果您不仔细调整查询以仅产生单个结果SELECT,并且在不“放弃”的情况下,这可能是不可能的,在单个查询中检索更大的结果,然后使用 Linq-to-聚合或以其他方式操作数据的对象。例如这个“查询” 。

因此,一般来说,程序员需要确保在可能导致多个查询的 LINQ 查询周围添加事务。我们只需要确定哪些 LINQ 查询可以转换为多个 SQL 查询。