2016-12-17 11 views
0

日付を選択すると、その日に予約を行ったユーザーの名前を表示したいが、最後の予約を行ったユーザーのみが表示されます。これをどうすれば解決できますか?私の意見ではここFirstorDefaultでC#Linq

私のコード

foreach (Reservation i in con.Reservations) 
     { 
      var user = con.Users.Where(se => se.id == i.user_id).FirstOrDefault(); 
      if (i.date == date && i.hour == label4.Text) 
       { 

       label4.Text = user.Name + " " + user.Surname; 
       } 
       else 
       { 
        label4.Text = "17:00 - 18:00"; 
       } 

       if (i.date == date && i.hour == label5.Text) 
       { 


       label5.Text = user.Name + " " + user.Surname; 
       } 
       else 
       { 
        label5.Text = "16:00 - 17:00"; 
       } 

      if (i.date == date && i.hour == label6.Text) 
      { 

       label6.Text = user.Name + " " + user.Surname; 
      } 
      else 
      { 
       label6.Text = "18:00 - 19:00"; 
      } 

      if (i.date == date && i.hour == label7.Text) 
      { 

       label7.Text = user.Name + " " + user.Surname; 
      } 
      else { 
       label7.Text = "19:00 - 20:00"; 
      } 
} 

ここに私のテーブル enter image description here

マイフォーム enter image description here

+1

FirstOrDefault明示的に1つのみを要求します。 '.FirstOrDefault()'を削除し、コードを更新して、1つではなく多くの行を処理します。 – Rob

+0

.FirstOrDefault()を削除したときにエラーが発生しました。 私はこのように使用することはできません - > user.Name – oEs

+2

はい、それは正しい - 'あなたのコードを更新して、1つではなく多くの行を処理する'の一部です。これで、ユーザーのリストが作成されました。リスト内の各ユーザーを印刷するコードを記述します。たとえば、名前をカンマで区切ることができます: 'var userNames = string.Join("、 "users.Select(u => u.Name +" "+ u.Surname))' – Rob

答えて

1

私はあなたが次のことを行う必要があると考えている:

  • は(それらの予約を通じて、今日
  • ループの予約を検索し、各時間に対応するラベルを見つけ、デフォルトのテキスト
  • でラベルをリセット予約時間を使用すると、常に1つを見つける必要があります)
  • ユーザー(もしあれば)を探します。見つかった場合は、ユーザー名とラベルテキストを上書き

このような何か:

var labelMap = new Dictionary<string, Label> 
{ 
    { "16:00 - 17:00", label1 }, { "17:00 - 18:00", label2 }, { "18:00 - 19:00", label3 }, { "19:00 - 20:00", label4 }, 
    { "20:00 - 21:00", label5 }, { "21:00 - 22:00", label6 }, { "22:00 - 23:00", label7 }, { "23:00 - 24:00", label8 } 
}; 

// IMPORTANT: Reset all labels text to start fresh 
foreach (var timeLabelItem in labelMap) 
{ 
    // labelXX.Text = "YY:00 - ZZ:00"; 
    timeLabelItem.Value.Text = timeLabelItem.Key; 
} 

var today = DateTime.Today; 

// This would work even with DateTime.Now 
// OFF-TOPIC WARNING: If you store UTC time, it will come back as DateTime.Kind == Unspecified. This can bite you 
var reservationsForToday = con.Reservations 
    .Where(x => 
     x.date.Year == today.Year 
     && x.date.Month == today.Month 
     && x.date.Day == today.Day) 
    .ToList(); 

foreach (var reservation in reservationsForToday) 
{ 
    // Get which label is affected 
    var whichLabel = labelMap[reservation.hour]; 

    // Get who's the user, if any 
    var user = con.Users.FirstOrDefault(u => reservation.user_id == u.id); 

    if (user == null) 
    { 
     continue; 
    } 

    // LabelXX.Text = "Juan D'Alotto"; 
    whichLabel.Text = string.Concat(user.Name, " ", user.Surname); 
} 
+0

ありがとうありがとう:)) – oEs

+0

このアプローチはうまくいきましたか?それがうまくいくとすれば...なぜそれが機能するのか理解していますか? –

+0

はい、ありがとうございました。 – oEs

0

、あなたのロジックが間違っている、私は推測します。テキストボックスとラベルの値を割り当てるには内部にがあります。そのため、ループが終了するとReservationsコレクションの最後の要素が常に表示されます。したがって、ロジックを書き直す必要があります。

+0

例を挙げてください。 – oEs

1

あなたは、特定の日付の予約に関する必要なすべての情報(reservation_date)

var reservations = con.Reservations.Where(i=> i.Date == reservation_date).Select(s=> new { 
     date = s.date, 
     user_id = s.user_id, 
     name = s.user.name, // Reservations should be joined with Users 
     surname = s.user.surname, 
     hour = i.hour 
    }).Distinct(); 
を取得します。この方法

次に残りのロジックを適用できます

foreach (var res in reservations) 
{ 
    if (i.date == date && i.hour == label4.Text) 
    {  
     label4.Text = res.Name + " " + res.Surname; 
    } 
    else 
    { 
     label4.Text = "17:00 - 18:00"; 
    } 

    if (i.date == date && i.hour == label5.Text) 
    { 
     label5.Text = res.Name + " " + res.Surname; 
    } 
    else 
    { 
     label5.Text = "16:00 - 17:00"; 
    } 

    if (i.date == date && i.hour == label6.Text) 
    { 
     label6.Text = res.Name + " " + res.Surname; 
    } 
    else 
    { 
     label6.Text = "18:00 - 19:00"; 
    } 

    if (i.date == date && i.hour == label7.Text) 
    { 
     label7.Text = res.Name + " " + res.Surname; 
    } 
    else { 
     label7.Text = "19:00 - 20:00"; 
    } 
}