【问题标题】:Return Unique values and Sum LINQ返回唯一值和总和 LINQ
【发布时间】:2016-11-23 12:00:19
【问题描述】:

我有两张桌子:

  1. 零售商
  2. 发票

Retailers 有两列:

1.1。零售商 ID

1.2。零售商名称

Invoices 包含三列:

2.1。发票编号

2.2。发票利润

2.3。零售商 ID

Retailers.RetailerID 链接到Invoices.RetailerID(一对多)。

我想要做的是编写一个返回 Retailer.RetailerID、Retailer.RetailerName、Invoice.InvoiceProfit 的 linq(或以 lambda exp 的形式)。

我可以这样做:

var retailers = from r in db.Retailers select t; 
var invoices = from i in db.Invoices select i; 

var retailersAndInvoices = from r in retailers join i in invoices on r.RetailerID equals i.RetailerID select new {t.RetailerName, i.InvoiceProfit}; 

我只想返回Distinct RetailerNamesSum 以及每个旁边的所有Invoices.InvoiceProfit - 目的是“十大零售商”!

我该怎么做?

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    • 使用GroupBy 将平面列表转换为RetailerName 的组
    • 使用Sum(i => i.InvoiceProfit) 计算总数
    • 使用new { ... } 将零售商与其利润总额配对
    • 使用OrderByDescending(p => p.TotalProfit) 让高利润零售商登上榜首
    • 使用Take(10) 将列表限制为十项。

    整体查询如下所示:

    var topTen = retailersAndInvoices
        .GroupBy(ri => ri.RetailerName)
        .Select(g => new {
            Retailer = g.Key
        ,   TotalProfit = g => g.Sum(i => i.InvoiceProfit)
        })
        .OrderByDescending(p => p.TotalProfit)
        .Take(10)
        .ToList();
    

    【讨论】:

      【解决方案2】:

      我使用 lambda 和 linq 的组合。见msdn:https://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Data;
      
      namespace ConsoleApplication28
      {
          class Program
          {
              static void Main(string[] args)
              {
                  DataTable retailers = new DataTable();
                  retailers.Columns.Add("RetailerID", typeof(int));
                  retailers.Columns.Add("RetailerName", typeof(string));
      
                  retailers.Rows.Add(new object[] { 123, "abc" });
                  retailers.Rows.Add(new object[] { 124, "abd" });
                  retailers.Rows.Add(new object[] { 125, "abe" });
      
                  DataTable invoices = new DataTable();
                  invoices.Columns.Add("InvoiceID", typeof(int));
                  invoices.Columns.Add("InvoiceProfit", typeof(decimal));
                  invoices.Columns.Add("RetailerID", typeof(int));
      
                  invoices.Rows.Add(new object[] { 100, 200, 123 });
                  invoices.Rows.Add(new object[] { 101, 201, 123 });
                  invoices.Rows.Add(new object[] { 102, 202, 123 });
                  invoices.Rows.Add(new object[] { 103, 203, 123 });
                  invoices.Rows.Add(new object[] { 104, 204, 124 });
                  invoices.Rows.Add(new object[] { 105, 205, 124 });
                  invoices.Rows.Add(new object[] { 106, 206, 124 });
                  invoices.Rows.Add(new object[] { 107, 207, 125 });
                  invoices.Rows.Add(new object[] { 108, 208, 125 });
                  invoices.Rows.Add(new object[] { 109, 209, 125 });
      
                  var retailersAndInvoices = (from r in retailers.AsEnumerable()
                                              join i in invoices.AsEnumerable() on r.Field<int>("RetailerID") equals i.Field<int>("RetailerID")
                                              select new { name = r.Field<string>("RetailerName"), profit = i.Field<decimal>("InvoiceProfit") })
                                             .GroupBy(x => x.name)
                                             .Select(x => new { name = x.Key, totalProfit = x.Select(y => y.profit).Sum() }).ToList();
      
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多