被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()
然而,这个答案其实每个检索的Min
和Max
(如果你包括像其它集合函数Count
和Average
),在单独的 SQL查询。 这可以很容易地看到LINQPad。
是否有一个交易(或别的东西,让这些查询原子)不LINQPad所示,或者这是一个等待发生的竞争条件? (所以你必须做在回答上述问题,强制返回多个聚集在一个查询显示的技巧。)
总之,有使用LINQ到SQL查询Aggregate
在单个(或至少“原子”)查询返回多个集合函数?
(我也说“很明显”,因为明显的答案对我来说, Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)
实际上获得了整个表的两倍,优化甚至当,然后使用Linq-到实体Min
和Max
,以获得结果:-()
我想Aggregate
不是VB-具体,但它看起来像C#没有这个查询表达式,所以我已经改变了.NET到vb.net 。
虽然它不使用总结关键字,您可以使用下面的语法做一个查询多项功能:
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的客户端对象上执行最大
要回答我的更广泛的问题:在Aggregate
打破了产生了独立的SQL查询,而交易?
所有LINQ可以引起,如果你不仔细调整你的查询只导致单个SELECT
,那是不可能的,没有“放弃”,在检索单个查询一个较大的结果,然后使用LINQ到-Objects聚集或以其它方式操纵的数据。 该“查询”为例。
所以,在一般情况下,由程序员,以确保交易的周围,可能会导致多次查询LINQ查询添加。 我们只需要知道肯定这LINQ查询可以转换成多个SQL查询。
文章来源: Is Aggregate fatally flawed because each into clause is executed separately?