当用作具有多个Into子句的
Linq表达式的第一个(外部)子句时,VB.NET的聚合查询是否有致命的缺陷,因为每个Into子句都是单独执行的?
SELECT MIN(ZoneMin),MAX(ZoneMin) FROM Plant
in LINQ to SQL的“明显”答案是
Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(),Max()
但是,这个答案实际上是在单独的SQL查询中检索Min和Max中的每一个(并且包括其他聚合函数如Count和Average).这可以在LINQPad中轻松看到.
LINQPad没有显示一个事务(或其他使这些查询原子的事情),还是等待发生的竞争条件? (所以你必须做上面问题的答案中显示的技巧,强制单个查询返回多个聚合.)
总而言之,是否有使用Aggregate的LINQ-to-SQL查询在单个(或至少“原子”)查询中返回多个聚合函数?
(我也说“明显”,因为对我的明确答案,在植物最小(p.ZoneMin),Max(p.ZoneMin)中,实际上检索整个表格两次,即使经过优化,然后使用Linq- to-Entities Min和Max获取结果:-()
虽然它不使用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到对象在客户端上执行Max.