2015-11-04 39 views
3

我有對象與OrderItems的順序。 我需要按字段ProductId對數據進行分組(按orderItems),並顯示每個產品的總和。 該解決方案行之有效:MongoDB C#聚合 - 展開 - > groupBy

var collection = database.GetCollection<Order>("Order"); 
var result = collection.Aggregate().Unwind(x=>x.OrderItems) 
.Group(new BsonDocument 
       { 
          {"_id", "$OrderItems.ProductId"}, 
          {"suma", new BsonDocument 
           { 
            { "$sum" , "$OrderItems.UnitPriceExclTax"} 
           } 
          } 
       }).ToListAsync().Result; 

但是我不想用管道,我需要用C#編寫全樣本。 而此解決方案不起作用。

var collection = database.GetCollection<Order>("Order"); 
var result = collection.Aggregate() 
.Unwind(x=>x.OrderItems) 
.Group(i => i.ProductId, g => new { ProductId = g.Key, Count = g.Sum(i.UnitPriceExclTax) }) 

感謝您的幫助,

回答

-1

在我看來,你試圖使用linq語法而不是mongodb。我不知道任何解決方案可以使您在aggregation-pipeline中所描述的類似語法。

+1

,這是真的在2.2? –

3

我找到了解決方案, 我已經準備了額外的類:

 [BsonIgnoreExtraElements] 
     public class UnwindedOrderItem 
     { 
      public OrderItem OrderItems { get; set; } 
     } 

     var agg = database.GetCollection<Order>("Order") 
       .Aggregate() 
       .Unwind<Order, UnwindedOrderItem>(x => x.OrderItems) 
       .Group(x=>x.OrderItems.ProductId, g => new 
       { 
        Id = g.Key, 
        Suma = g.Sum(x=>x.OrderItems.PriceExclTax) 
       }) 
       .ToListAsync().Result;