2016-11-23 10 views
2

私は2つのテーブルがあります。戻りユニークな値と合計LINQ

1.1:

  1. 小売
  2. 請求書

小売業者は、2つの列があります。小売業者ID

1.2。小売業者名

請求書には、3列:

2.1があります。請求書ID

2.2。 InvoiceProfit

2.3小売業者ID

Retailers.RetailerIDは、1対多の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を返すようにしたい - 目的は、「トップテン小売業者」です!

どうすればいいですか?

答えて

4
  • に高収益の小売業者を取得するために彼らの利益の合計
  • 使用OrderByDescending(p => p.TotalProfit)と小売店をペアリングする合計
  • 使用new { ... }を計算するためにRetailerName
  • 使用Sum(i => i.InvoiceProfit)によってグループにフラットなリストを変換するために使用GroupByトップ
  • Take(10)を使用してリストを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(); 
0

私は、ラムダと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(); 


     } 
    } 
}