因为每到子句单独执行的总致命的缺陷?(Is Aggregate fatally flawed bec

2019-06-27 18:58发布

被VB.NET的Aggregate作为第一(外)具有多个LINQ表达式的子句中使用时查询致命的缺陷Into因为每个子句Into子句单独执行?

该“显而易见”的答案SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant中的LINQ to SQL是

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

然而,这个答案其实每个检索的MinMax (如果你包括像其它集合函数CountAverage ),在单独的 SQL查询。 这可以很容易地看到LINQPad。

是否有一个交易(或别的东西,让这些查询原子)不LINQPad所示,或者这是一个等待发生的竞争条件? (所以你必须做在回答上述问题,强制返回多个聚集在一个查询显示的技巧。)

总之,有使用LINQ到SQL查询Aggregate在单个(或至少“原子”)查询返回多个集合函数?

(我也说“很明显”,因为明显的答案对我来说, Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)实际上获得了整个表的两倍,优化甚至当,然后使用Linq-到实体MinMax ,以获得结果:-()

我想Aggregate不是VB-具体,但它看起来像C#没有这个查询表达式,所以我已经改变了.NET到vb.net 。

Answer 1:

虽然它不使用总结关键字,您可以使用下面的语法做一个查询多项功能:

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 o in Orders
into Sum(o.Freight),
Average(o.Freight),
Max(o.Freight)

这将发出3个数据库请求。 前两个执行单独聚合条款。 第三拉动整个表返回到客户端,并通过LINQ的客户端对象上执行最大



Answer 2:

要回答我的更广泛的问题:在Aggregate打破了产生了独立的SQL查询,而交易?

所有LINQ可以引起,如果你不仔细调整你的查询只导致单个SELECT ,那是不可能的,没有“放弃”,在检索单个查询一个较大的结果,然后使用LINQ到-Objects聚集或以其它方式操纵的数据。 该“查询”为例。

所以,在一般情况下,由程序员,以确保交易的周围,可能会导致多次查询LINQ查询添加。 我们只需要知道肯定这LINQ查询可以转换成多个SQL查询。



文章来源: Is Aggregate fatally flawed because each into clause is executed separately?