2017-08-02 27 views
0

我还没有找到任何关于LINQ Group的这个具体问题的答案&聚合,所以我希望有人在这里可以提供帮助。我有这样的机型列表:LINQ Group&Sum其他模型的模型列表

public class BasketProduct 
{ 
    public ProductItem Product { get; set; } 
    public int   Quantity { get; set; } 
    public decimal  SubTotal { get; set; } 
    public DateTime  DateAdded { get; set; } 
} 

,其中第一属性是另一种模式:

public class ProductItem 
{ 
    public int  ID { get; set; } 
    public string Description { get; set; } 
    public char  Item { get; set; } 
    public decimal Price { get; set; } 
    public string ImagePath { get; set; } 
    public string Barcode { get; set; } 
} 

我基本上希望能集团和总结这个名单上:

List<BasketProduct> allBasketProducts = 

使用以下内容:

 allBasketProducts = allBasketProducts 
      .GroupBy(x => x.Product.ID) 
      .Select(y => new BasketProduct 
             { 
              Product.ID = y.First().Product.ID, 
              Product.Item = y.First().Product.Item, 
              Product.Description = y.First().Product.Description, 
              Quantity = y.Sum(z => z.Quantity), 
              Product.ImagePath = y.First().Product.ImagePath, 
              Product.Price = y.First().Product.Price, 
              SubTotal = y.Sum(z => z.SubTotal) 
             }).ToList(); 

然而,它严重地不喜欢这个(按红色squigly行和偶数red'er文本):

enter image description here

有人可以帮助吗?

+1

我不认为你需要'select'部分。但我可能会误解这个要求。你能解释究竟应该是什么结果? – Nisarg

+1

什么是错误/ s? –

回答

1

您的问题实际上与LINQ无关,它是您的ProductItem构造函数。你需要明确构建其嵌套Product对象,像这样:

allBasketProducts 
    .GroupBy(x => x.Product.ID) 
    .Select(y => new BasketProduct 
     { 
      Quantity = y.Sum(z => z.Quantity), 
      SubTotal = y.Sum(z => z.SubTotal), 
      Product = new ProductItem 
      { 
       ID = y.First().Product.ID, 
       Item = y.First().Product.Item, 
       Description = y.First().Product.Description, 
       ImagePath = y.First().Product.ImagePath, 
       Price = y.First().Product.Price 
      } 
     }).ToList(); 
0

尝试以下操作:

  allBasketProducts = allBasketProducts 
      .GroupBy(x => x.Product.ID) 
      .Select(y => new BasketProduct() 
      { 
       Product = new ProductItem() { 
        ID = y.First().Product.ID, 
        Item = y.First().Product.Item, 
        Description = y.First().Product.Description, 
        ImagePath = y.First().Product.ImagePath, 
        Price = y.First().Product.Price 
       }, 
       Quantity = y.Sum(z => z.Quantity), 
       SubTotal 
0

当您指定Select的类型,编译器期望该类型的唯一属性。因此,您只能在您的代码中设置属性ProductSubtotalQuantityDateAdded

只需通过选择具有符合您的分组密钥的ID的第一个产品找到产品:

var allBasketProductsGroupedByProductID = allBasketProducts 
         .GroupBy(x => x.Product.ID) 
         .Select(y => new BasketProduct 
         { 
          Product = y.First(i => i.Product.ID == y.Key).Product, 
          Quantity = y.Sum(z => z.Quantity), 
          SubTotal = y.Sum(z => z.SubTotal)     
         }).ToList(); 
1
var totals = 
    (from b in allBasketProducts 
    group new { b.Quantity, b.SubTotal, Product= b.Product } by b.Product.ID into g 
    select new BasketProduct 
    { 
     Product = g.First().Product, 
     SubTotal = g.Sum(z => z.SubTotal), 
     Quantity = g.Sum(z => z.Quantity) 
    }).ToList(); 
0

试试这个 名单allBasketProducts =新名单();

 allBasketProducts = new List<BasketProduct>() 
     { 
      new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = 1, 
        Price = 5, 
       }, 
       Quantity = 2, 
       SubTotal = 2, 

      }, 

      new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = 1, 
        Price = 5, 
       }, 
       Quantity = 4, 
       SubTotal = 2, 

      }, 
      new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = 2, 
        Price = 10, 
       }, 
       Quantity = 3, 
       SubTotal = 2, 

      }, 
      new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = 3, 
        Price = 20, 
       }, 
       Quantity = 3, 
       SubTotal = 2, 

      }, 
      new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = 2, 
        Price = 20, 
       }, 
       Quantity = 3, 
       SubTotal = 2, 

      } 
     }; 

     allBasketProducts = allBasketProducts 
      .GroupBy(x => x.Product.ID) 
      .Select(y => new BasketProduct() 
      { 
       Product = new ProductItem() 
       { 
        ID = y.First().Product.ID, 
        Item = y.First().Product.Item, 
        Description = y.First().Product.Description, 
        ImagePath = y.First().Product.ImagePath, 
        Price = y.First().Product.Price 
       }, 
       Quantity = y.Sum(z => z.Quantity), 
       SubTotal = y.Sum(z => z.SubTotal) 
      }).ToList();