2017-01-15 5 views
0

보기를 표시 나는 테이블이 CURRENCY라고 있습니다LINQ에 쿼리 및

------------------------- 
| Id | CurrencyName | 
| 1 |  USD  | 
| 2 |  EUR  | 
| 3 |  JPY  | 
------------------------- 

을 그리고 내가 다른 테이블 호출 한 판매 : 나는 출력에이

--------------------------------------------------------------- 
| Id | Sales |  TransactionDate | CurrencyID | 
| 1 | 5000 |  11/25/2016  |   1  | 
| 2 | 3000 |  11/25/2016  |   1  | 
| 3 | 4000 |  11/26/2016  |   2  | 
--------------------------------------------------------------- 

이 테이블은 다음과 같습니다 :

----------------------------------------------------------------- 
| TransactionDate |  USD  |  EUR |  JPY | 
|  11/25/2016 |  8000  |  0 |  0  | 
|  11/26/2016 |  0  |  4000 |  0  | 
----------------------------------------------------------------- 

어디서부터 시작해야할지 모르겠습니다. 나는 MVCLINQ을 정말 처음 보았습니다. 그래서 제가 얻을 수있는 모든 도움이 필요합니다.

+0

동적 통화 열이 필요합니까? 내일 다른 통화가 지원된다면 어떻게 될까요? –

+0

예, 동적입니다. 그것이 통화를위한 별도의 테이블을 가지고있는 이유입니다. –

+0

* 어디에서 시작해야할지 모르겠습니다. * 스택 오버플로가 아닙니다. 너가 행운이라면 너는 물고기를 낚을거야, 낚싯대는 아니야. LINQ에 대한 온라인 자습서를 찾으십시오. –

답변

1

성능에 가장 최적화되어 있는지는 잘 모르겠지만 제대로 작동하지는 않습니다. 방법을 사용합니다. 하나는 TransactionDate로 그룹화하고 하나는 통화를 그룹화합니다.

Dictionary 또는 Lookup으로 최적화 할 수 있습니다.

public class Program 
{ 
    public static void Main() 
    { 
     var currencies = new List<CurrencyRecord> 
     { 
      new CurrencyRecord {Id = 1, Name = "USD"}, 
      new CurrencyRecord {Id = 2, Name = "EUR"}, 
      new CurrencyRecord {Id = 3, Name = "JPY"} 
     }; 

     var sales = new List<SalesRecord> 
     { 
      new SalesRecord {Id = 1, Sales = 5000, TransactionDate = DateTime.Parse("2016-11-25"), CurrencyId = 1}, 
      new SalesRecord {Id = 2, Sales = 3000, TransactionDate = DateTime.Parse("2016-11-25"), CurrencyId = 1}, 
      new SalesRecord {Id = 3, Sales = 4000, TransactionDate = DateTime.Parse("2016-11-26"), CurrencyId = 2} 
     }; 

     var result = sales.GroupBy(sale => sale.TransactionDate, 
      (key, values) => 
       new 
       { 
        Key = key, 
        Sales = values.GroupBy(v => v.CurrencyId, (c, values2) => new {CurrencyId = c, SumSales = values2.Sum(v2 => v2.Sales)}) 
       }); 

     Console.Write("Date\t\t"); 
     foreach (CurrencyRecord currency in currencies) { 
      Console.Write($"{currency.Name}\t"); 
     } 
     Console.WriteLine(); 

     foreach (var record in result) { 
      Console.Write($"{record.Key.ToShortDateString()}\t"); 
      foreach (CurrencyRecord currency in currencies) 
      { 
       var sum = record.Sales.Where(s => s.CurrencyId == currency.Id).Select(s => s.SumSales).DefaultIfEmpty(0).Single(); 
       Console.Out.Write($"{sum}\t"); 
      } 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 
    } 
} 

public class CurrencyRecord 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class SalesRecord 
{ 
    public int Id { get; set; } 
    public int Sales { get; set; } 
    public DateTime TransactionDate { get; set; } 
    public int CurrencyId { get; set; } 
}