【问题标题】:Linq with sum and group from two tables来自两个表的总和和组的 Linq
【发布时间】:2017-11-11 11:30:10
【问题描述】:

您好,我有两张桌子,

产品:

ProductID | IssueDate | Amount

1           2017-06-01  1000
2           2017-06-01  1000
3           2017-06-02  500

和信用:

ProductID | Amount

1           500
1           500
2           1000
3           500

如果我从 SQL Server 使用这样的查询:

SELECT p.IssueDate, SUM(p.Amount), SUM(p.Total) 
FROM (SELECT p.IssueDate, SUM(p.Amount) AS Amount, 
(SELECT TOP 1 SUM(c.Amount) FROM Credit c WHERE p.Id = c.ProductId) AS Total from Product p
GROUP BY p.IssueDate, p.Id) p
GROUP BY p.IssueDate

我得到这个结果:

IssueDate | Amount | Total

2017-06-01  2000     2000
2017-06-02  500      500

在 C# Linq 中,我可以通过如下两个查询来获取这些数据:

var data = from p in Products.Collection
           select new
           {
              Product = p,
              Credits = Credit.Collection.Where(c => c.ProductID == p.ID).Sum(c => c.Amount)
           };

var result = from d in data
           group d by new
           {
               IssueDate = d.Product.IssueDate
           } into gr
           select new
           {
               IssueDate = gr.Key.IssueDate,
               Credits = gr.Sum(s => s.Credits),
               Total = gr.Sum(s => s.Product.Amount)
           };

var test = result.ToList();

有没有人知道更好(更简单)的解决方案来获得这个结果?也许在一个查询中?

【问题讨论】:

  • 对我来说简单易读。当前的 LINQ 查询有什么复杂的地方?
  • 我考虑了效率,也许在一个查询中会更好。
  • LINQ 生成 SQL。是一个查询还是多个查询?他们看起来怎么样?也许它已经很有效了?也许它经过优化并且比您的 SQL 查询执行得更好。

标签: c# linq group-by sum


【解决方案1】:

怎么样:

Products.Collection.GroupBy(x => x.IssueDate)
            .Select(x => new
            {
                IssueDate = x.Key,
                Amount = x.Sum(p => p.Amount),
                Total = Credit.Collection.Where(c => x.Any(p => p.ProductID == c.ProductID)).Sum(c => c.Amount)
            }).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多