【问题标题】:lambda expression for one to many relationship一对多关系的 lambda 表达式
【发布时间】:2012-10-24 08:08:55
【问题描述】:

我确定这是个愚蠢的问题,但我寻找答案却找不到。

我有桌子

  1. Customers 包含三列:userId、name 和 orderId。
  2. 订单包含三列:orderId、userId、price。

表之间的关系是一个客户对多个订单。

我想汇总某个用户的订单价格。 它应该看起来像这样:

double totalPrice = currentUser.Orders.Sum(x=>x.price);

这不起作用。这样做的正确方法是什么?谢谢。

【问题讨论】:

  • '这不起作用' - 一个错误或 totalPrice 的值不是你所期望的?

标签: c# linq lambda one-to-many


【解决方案1】:

我认为你应该从你的实体对象中选择用户(在这种情况下,userId=1)

           int i= users.Single(x => x.UserID== 1).Orders.Sum(x => x.Price);

【讨论】:

    【解决方案2】:
    decimal totalPrice = users.SelectMany(user => user.Orders)
                             .Sum(order => (decimal?)order.Price) ?? 0;
    

    decimal totalPrice = (from user in users
                         from order in user.Orders
                         select (decimal?)order.Price).Sum() ?? 0;
    

    更新

    使用double 表示财务价值是不合适的,因为它是二进制浮点 点类型。将product.Price 转换为decimal? 表示它是一个可以为空的小数,因此需要使用Value 属性来获取实际值(如果存在,则通过HasValue 确定)

    【讨论】:

    • 可能值得解释一下你为什么需要这个。这是因为如果订单中没有记录(适用于用户),则总和的结果为 null,如果期望双精度,则会产生强制转换异常。
    • 我刚刚做了一个修改,解释了为什么使用decimal?,这表明它是一个nullable小数,所以如果有一个空订单价格,就不会有任何铸造异常那个用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多