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

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant in LINQ to SQL 的“明显”答案是

Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max()

但是,这个答案实际上会在单独的查询中检索 MinMax(并且如果您包含其他聚合函数,如 CountAverage )。这在 LINQPad 中很容易看到。

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

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

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

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

最佳答案

尽管它不使用 Aggregate 关键字,但您可以使用以下语法在单个查询中执行多个功能:

Dim query = From book In books _
    Group By key = book.Subject Into Group _
    Select id = key, _
        BookCount = Group.Count, _
        TotalPrice = Group.Sum(Function(_book) _book.Price), _
        LowPrice = Group.Min(Function(_book) _book.Price), _
        HighPrice = Group.Max(Function(_book) _book.Price), _
        AveragePrice = Group.Average(Function(_book) _book.Price)

不过,Aggregate 子句的实现似乎确实存在问题。考虑来自 Northwind 的以下查询:
Aggregate o in Orders
into Sum(o.Freight),
Average(o.Freight),
Max(o.Freight)

这会发出 3 个数据库请求。前两个执行单独的聚合子句。第三个把整个表拉回客户端,通过Linq to Objects在客户端执行Max。

关于vb.net - Aggregate 是否存在致命缺陷,因为每个 into 子句都是单独执行的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12264751/

10-13 21:32