2016-07-06 7 views
0

私はプログラミングでは新しく、私はWindowsフォームアプリケーションで作業しています。私はすべての私のデータベースの仕事のための再作成クラスを作った。 IQueryableを返すリポジトリ内の関数を作成しました。これはキーの値のペアを返します(key = dayOfWeekとvalue = revenue)。私はフォームでこの関数を呼び出したとき、ラベルに情報を表示したかったので、別にキーと値を別々にアクセスすることはできません。それは私にキーの値のペア全体のオプションを与えるだけです。私はリポジトリクラスから取得したwinformでIQueryableを返す関数からキーと値にアクセスできません

public class ReportsRepository 
    { 
     FruitStoreDataContext db; 
     public IQueryable RevenuePerDayOfWeek(DateTime startDate, DateTime endDate) 
     { 
      db = new FruitStoreDataContext(); 
     var sumPerday = from s in db.OrderDetails 
         where s.Order.OrderDate >=startDate && s.Order.OrderDate <=endDate 
         select new 
         { 
          day = s.Order.OrderDate.DayOfWeek, 
          revenue = s.Price * s.Quantity 
         }; 

     var totalSumPerday = from f in sumPerday 
          group f.revenue by f.day into g 
          select new 
          { 
           Day= g.Key, 
           Sum = g.Sum() 
          }; 

     return totalSumPerday; 
    } 

private void Report1Form_Load(object sender, EventArgs e) 
     { 
      ReportsRepository report = new ReportsRepository(); 
      var totalSumPerday = report.RevenuePerDayOfWeek(dateToStart, dateToEnd); 
      int[]numOfDays = new int[7]; 


     for (DateTime day = dateToStart; day <= dateToEnd; day = day.AddDays(1)) 
     { 

      dayOfWeek = Convert.ToInt32(day.DayOfWeek); 
      numOfDays[dayOfWeek]++; 

     } 
     Label label; 
     List<Label> labels = new List<Label>(); 
     int t = 0; 

     foreach(var totalSum in totalSumPerday) 
     { 

      if (numOfDays[dayOfWeek] == 0) 
       numOfDays[dayOfWeek] = 1; 
      int y = (38 * t) + 60; 
      label = new Label(); 
      label.Location = new Point(34, y); 
      label.Visible = true; 
      label.Size = new Size(450, 35); 
      label.BackColor = Color.Gray; 
      label.ForeColor = Color.White; 
      label.Font = new Font("Lucida Console", 16); 
      dayOfWeek = Convert.ToInt16(totalSum.Day.Key); 

     //on the line below the word 'Day' and 'Sum' are underlined red...it doesn't give me the option to do that. I can only access the whole thing together(key,value) 
      label.Text = totalSum.Day.ToString() + " : " + (totalSum.Sum/numOfDays[dayOfWeek]).ToString(); 
      labels.Add(label); 
      panel1.Controls.Add(label); 
      t++; 
     } 

答えて

0

まず、あなたがあなたの結果を達成するために1つのクエリを実行できます。 これは、リポジトリクラスの私のコードです。次に、IQueryableをメモリ内のデータとしてのみ返す必要はありません(これ以上のクエリは必要ありません)。それでは、あなたができることは次のとおりです。Report1Form_Load

public Dictionary<int, decimal> RevenuePerDayOfWeek(DateTime startDate, DateTime endDate) 
{ 
    db = new FruitStoreDataContext(); 

    var sumPerday = (from s in db.OrderDetails 
        where s.Order.OrderDate >= startDate && s.Order.OrderDate <= endDate 
        group s by s.Order.OrderDate.DayOfWeek into grp 
        select new 
        { 
         Day = grp.Key, 
         Sum = grp.Sum(a => a.Price * a.Quantity) 
        }).ToDictionary(x => x.Day, x => x.Sum); 

    return sumPerday; 
} 

使用法:

var totalSumPerday = report.RevenuePerDayOfWeek(dateToStart, dateToEnd); 

foreach (var totalSum in totalSumPerday) 
{ 
    DayOfWeek dayOfWeek = totalSum.Key; 
    decimal sum = totalSum.Value; 

    // continue your code 
} 
+0

おかげ億!今は完全に動作します。 –

関連する問題