繁体   English   中英

返回唯一值和LINQ和

[英]Return Unique values and Sum LINQ

我有两个表:

  1. 零售商
  2. 发票

零售商有两列:

1.1。 RetailerID

1.2。 RetailerName

发票分为三列:

2.1。 InvoiceID

2.2。 InvoiceProfit

2.3。 RetailerID

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 RetailerNames和所有Invoices.InvoiceProfitSum ,其目的是“十大零售商”!

我怎样才能做到这一点?

  • 使用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();

我使用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();


        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM