2015-09-25 47 views
0

我有客户List<Customer> customers = new List<Customer>();列表这种格式Linq查询计算对象属性的总和

class Customer { 
    public string Name; 
    public string City; 
    public Order[] Orders; 

} 

class Order { 
    public int Quantity; 
    public Product Product; 

} 

class Product { 
    public string Name; 
    public decimal Price; 
} 

每一个客户都被实例化这样的:

Customer customer3 = new Customer { 
     Name = "Kostas", 
     City = "Athens", 
     Orders = new Order[] { 
      new Order {Quantity = 1, Product = new Product {Name = "Juice", Price = 20 } }, 
     }, 
    }; 

我想写一个LINQ查询打印出客户的名字和所有订单的总金额。

到目前为止,经过很多次尝试之后,我所做的最接近的事情就是这样,但它并不像预期的那样工作。

 var query= from c in customers 
         from p in c.Orders 
         let summary = p.Product.Price * p.Quantity 
         select new {c.Name, summary }; 

回答

2

使用Select创建与订单数量和产品价格的Sum匿名对象的列表。请注意,这是使用表达式语法而不是查询语法。

var query = customers.Select(c => new { 
    Name = c.Name, 
    OrderTotal = c.Orders.Sum(o => o.Quantity * o.Product.Price) 
}); 

这将导致一个IEnumerable<T>,其中T是含有用于NameOrderTotal道具一个匿名对象。

+0

谢谢非常,像魅力一样工作。你能不能写出类似SQL的版本,用于教育目的 – Manos

+0

@John不在这个问题的范围之内,为了避免混淆这个答案,最好是你问另一个问题。确保显示您的相关数据库模式。我会说你将需要使用'内部连接','分组依靠'和'sum'。 –

0

你应该改变你的方式来解决它。

我想你应该创建一个客户类

这样

class Customer 
{ 
    public string Name; 
    public string City; 
    public Order[] Orders; 
    public int Summary 
    { 
     get 
     { 
      int result = 0; 
      foreach(Order order in this.Orders) 
      { 
       result += order.Product * order.Quantity; 
      } 
      return result; 
     } 
    } 
} 

,然后你可以得到公正的foreach代码“摘要”的属性,只是

 foreach(Customer customer in customers) 
     { 
      Console.WriteLine("{0}/{1}", customer.Name, customer.Summary); 
     }