0

私はいくつかのサンプル データを持っており、5 つの「最も売れた製品」を特定しようとしています。次に、2013 年 6 月に ID#1 のクライアントがこれらの製品のそれぞれを何個購入したかを調べています。

次のデータ構造があります。

public class MonthlyHistoric
{

  public int StoreCode { get; set; }
  public int Month { get; set; }
  public int Year { get; set; }
  public int NumberOfSales { get; set; }
  public int ItemCode { get; set; }

}

public class Recipt
{
  public int Id { get; set; }
  public DateTime SaleDate { get; set; }
  public int CustomerID {get;set;}
}

public class ReciptDetails
{
  public int Id { get; set; }
  public int IdRecipt { get; set; }
  public int ItemCode { get; set; }
  public int AmountSold { get; set; }
}

次のテストデータがあります。

List<MonthlyHistoric> Historic = new List<MonthlyHistoric> { 
  new MonthlyHistoric() {ItemCode= 101, Month=6, NumberOfSales=20,StoreCode=7,Year= 2013 },
  new MonthlyHistoric() {ItemCode= 102, Month=6, NumberOfSales=100,StoreCode=7,Year= 2013 },
  new MonthlyHistoric() {ItemCode= 103, Month=6, NumberOfSales=30,StoreCode=7,Year= 2013 },
  new MonthlyHistoric() {ItemCode= 105, Month=6, NumberOfSales=20,StoreCode=3,Year= 2013 }};

List<Recipt> Recipts = new List<Recipt> { 
  new Recipt() { Id = 1, SaleDate = new DateTime(2013, 6, 02), CustomerID =1 },
  new Recipt() { Id = 2, SaleDate = new DateTime(2013, 7, 01), CustomerID =1 },
  new Recipt() { Id = 3, SaleDate = new DateTime(2013, 6, 04), CustomerID =2 },
  new Recipt() { Id = 4, SaleDate = new DateTime(2013, 5, 14), CustomerID =1 },
  new Recipt() { Id = 5, SaleDate = new DateTime(2013, 6, 16), CustomerID =2 },
  new Recipt() { Id = 6, SaleDate = new DateTime(2013, 6, 12), CustomerID =1 }};

List<ReciptDetails> Details = new List<ReciptDetails> { 
   new ReciptDetails() { AmountSold = 200, Id = 1, IdRecipt = 1, ItemCode = 101 },
   new ReciptDetails() { AmountSold = 234, Id = 1, IdRecipt = 1, ItemCode = 101 },
   new ReciptDetails() { AmountSold = 2050, Id = 1, IdRecipt = 2, ItemCode = 101 },
   new ReciptDetails() { AmountSold = 20340, Id = 1, IdRecipt = 2, ItemCode = 102 },
   new ReciptDetails() { AmountSold = 2300, Id = 1, IdRecipt = 3, ItemCode = 102 },
   new ReciptDetails() { AmountSold = 2200, Id = 1, IdRecipt = 3, ItemCode = 103 },
   new ReciptDetails() { AmountSold = 200, Id = 1, IdRecipt = 4, ItemCode = 101 },
   new ReciptDetails() { AmountSold = 10, Id = 1, IdRecipt = 5, ItemCode = 101 },
   new ReciptDetails() { AmountSold = 2400, Id = 1, IdRecipt = 6, ItemCode = 101 }};

次の式を使用すると、2013 年 6 月にある店舗 (この例では #7) で販売された上位 5 つの製品を取得できます。

Historic.Where (x => x.StoreCode == 7 && x.Year == 2013 && x.Month== 6).OrderBy (x =>x.NumberOfSales ).Take(5)

これらの 5 つの要素のそれぞれについて、クライアント番号 1 が 2013 年の 6 か月間に購入したアイテムの数を調べる必要があります。 5項目。

私はこれを単一のLinq式で実行しようとしています。ただし、複数の式はオプションです。

4

1 に答える 1

0

2 番目の LINQ 式を使用した例を次に示します。また、長い 1 行を (IMHO) より読みやすいクエリ構文に書き直しました。

var topItems = (from h in Historic
                where h.StoreCode == 7 && h.Year == 2013 && h.Month == 6
                orderby h.NumberOfSales
                select h.ItemCode).Take(5).ToList();
var sum =
   (from r in Recipts
    where r.CustomerID == 1 && r.SaleDate.Year == 2013 && r.SaleDate.Month == 6
    join d in Details on r.Id equals d.IdRecipt
    where topItems.Contains(d.ItemCode)
    select d.AmountSold).Sum();
Console.WriteLine(sum); // 2834
于 2013-10-30T18:14:10.580 に答える