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

标签 vb.net linq linq-to-sql aggregate-functions aggregate

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

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

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

然而,这个答案实际上检索了 Min 中的每一个。和 Max (并且如果您在单独的 SQL 查询中包含其他聚合函数,例如 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#没有这个查询表达式,所以我改变了 .

最佳答案

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

相关文章:

c# - 方法链接等效?

c# - "Specified cast is not valid"当空值返回为 Nullable<int>

c# - 如何使用 Linq 进行多级父子排序?

php - 使用php将文件部分下载到服务器

vb.net - 通过 VB.NET 检查我的笔记本电脑电池生命周期

c# - 取消嵌套列表迭代以提高性能

c# - 使用导航属性的 LINQ 查询生成多个 SELECT 语句

c# - Hangfire 和 VB.NET - 获取应用程序启动类中配置的内容

.net - 事件报告分组

linq - 需要一个简单的 linq