【问题标题】:linq query sum products across multiple collections跨多个集合的 linq 查询总和产品
【发布时间】:2012-06-11 20:23:02
【问题描述】:

我有两个如下所示的数据集:

+------------------------------------+
| Products                           |
+------------------------------------+
| Id | Name             | Price      |
+------------------------------------+
|  1 | apples           | 1.00       |
|  2 | oranges          | 2.00       |
|  3 | pomengrate       | 3.00       |
+------------------------------------+

+-------------------------------+
| Sales                         |
+-------------------------------+
| CustId | ProductId | Quantity |
+-------------------------------+
|      1 |         1 |        5 |
|      1 |         2 |        4 |
|      1 |         3 |        2 |
|      2 |         1 |        8 |
|      2 |         3 |        7 |
+-------------------------------+     

我想得到每个客户花费的金额,最终得到如下结果:

+----------------+
| CustId | Total |
+----------------+
|      1 | 19.00 |
|      2 | 29.00 |
+----------------+

我可以对单个表进行求和,但 LINQ 中的 Sum 方法采用只有一个参数的 lambda:对要求和的值所在的表的引用。这些值位于不同的表中。我如何将这些加在一起?

【问题讨论】:

  • LINQ 通常与数据库无关。你用的是什么ORM? (Linq2SQL?)
  • 它是 linqtosql,但据我了解,linq 的语法应该是相同的,无论是数据库读取还是 Products 和 Sales 是上述结构的对象集合
  • @Cameron,您的评论与他的问题没有任何关系。

标签: c# .net linq linq-to-sql


【解决方案1】:
var totals =
    from sale in Sales
    group sale by sale.CustId into custSales
    select new
    {
        CustId = custSales.Key, 
        Total = (
            from custSale in custSales
            select custSale.Product.Price *
                custSale.Quantity)
            .Sum()
    };

【讨论】:

  • 这只会给我客户购买的商品总数,而不是客户花费的金额
  • 您必须加入:from sale in Sales join prod in Products on prod.ID equals sale.ProductID。这将使用单个连接而不是子选择生成正确的 SQL。
  • @SPFiredrake:您不必使用联接。 LINQ to SQL 将为您生成正确的 SQL(除非出现性能问题,谁在乎生成的 SQL 是使用连接还是子选择)。这就是 LINQ -> DB 的优点。
  • @Steven,抱歉,但编辑无用,无法删除downvote ;)(和+)
  • 嗯,我昨晚没睡好,抱歉我是个讨厌鬼。今天看起来不错:)
【解决方案2】:

试一试。它给出了您正在寻找的结果:

var results = sales.Join(products,
    sale => sale.ProductID,
    product => product.ID,
    (sale, product) => new { CustID = sale.CustID, Total = sale.Quantity * product.Price })
    .GroupBy(r => r.CustID)
    .Select(g => new { CustID = g.Key, Total = g.Sum(gt => gt.Total) });

【讨论】:

  • 那个有效。 +1 ... 无法让小组使用我的查询语法方法,现在可能为时已晚
【解决方案3】:

为了完整起见,这里是查询语法版本(使用连接而不是子选择):

var totals =
    from sale in sales
    join prod in product on sale.ProductId equals prod.Id
    let saleProds = new { sale.CustId, Total = prod.Price * sale.Quantity }
    group saleProds by saleProds.CustId into custSale
    select new { Customer = custSale.Key, Total = custSale.Sum(tr => tr.Total) };

关键部分是您需要以某种方式将连接的集合结果(销售和产品)转换为单个实体,然后可以对其进行分组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多