2012-01-04 148 views
1

我有一个表的OrderDetail这样附加柱:EF查询包括与聚合数据

ID OrderNumber LineItem Qty 
--------------------------- 
1 10000   1  2 
2 10000   2  5 
3 10000   3  1 
4 10001   1  10 

我想与包含每个顺序(上ORDERNUMBER分组)的最大数量的额外的列返回此表,像这样:

ID OrderNumber LineItem Qty MaxQty 
----------------------------------- 
1 10000   1  2  5 
2 10000   2  5  5 
3 10000   3  1  5 
4 10001   1  10 10 

我一直在努力如何把EF语法放在一起。我想象的结果将是某种匿名类型,将OrderDetail记录作为第一个属性,将数量作为第二个属性,如select new { OrderDetail = ??, MaxQty = ?? }

感谢, 罗杰·马丁

回答

2

你可以得到MaxQty用一个子查询。使用EF DBContext API:

public class MyContext : DbContext 
{ 
    public DbSet<OrderDetail> OrderDetails { get; set; } 
} 

var context = new MyContext(); 
var result = context.OrderDetails.Select(od => 
    new { 
      OrderDetail = od, 
      MaxQty = context.OrderDetails 
      .Where(o => o.OrderNumber == od.OrderNumber).Max(a => a.Qty) }); 

它会生成以下SQL查询:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[OrderNumber] AS [OrderNumber], 
[Extent1].[LineItem] AS [LineItem], 
[Extent1].[Qty] AS [Qty], 
(SELECT 
    MAX([Extent2].[Qty]) AS [A1] 
    FROM [dbo].[OrderDetails] AS [Extent2] 
    WHERE [Extent2].[OrderNumber] = [Extent1].[OrderNumber]) AS [C1] 
FROM [dbo].[OrderDetails] AS [Extent1]} 
+0

谢谢 - 答案是很简单,但我仍然环绕我的头周围EF。真的很感激它... – Roger 2012-01-04 22:58:11