12

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

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

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

但是,此答案实际上检索了单独的SQL 查询中的每个Minand Max(如果您包括其他聚合函数,如Countand Average) 。这在 LINQPad 中很容易看到。

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

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

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

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

4

2 回答 2

1

尽管它不使用 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。

于 2012-09-04T14:46:49.633 回答
0

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

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

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

于 2012-10-05T13:06:56.110 回答