2016-12-17 5 views
0

Когда я выбираю дату, я хочу показать имя пользователей, сделавших бронирование на эту дату, но я могу видеть только пользователя, который сделал последнюю бронь. Как я могу это исправить?C# Linq with FirstorDefault

Вот мой код

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 явно запрашивает только одно. Удалите '.FirstOrDefault()', а затем обновите свой код, чтобы обрабатывать множество строк вместо одного. – Rob

+0

Когда я удалил .FirstOrDefault(), я получил ошибку. Я не могу использовать это -> user.Name – oEs

+2

Да, это правильно - часть «обновите свой код, чтобы обрабатывать многие строки вместо одного», о котором я упоминал. Теперь у вас есть список пользователей. Напишите свой код, чтобы распечатать каждого пользователя в списке. Например, вы можете захотеть отделить имена запятой: 'var userNames = string.Join (", ", users.Select (u => u.Name +" "+ u.Surname))' – Rob

ответ

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

На мой взгляд, ваша логика не так, я думаю. Вы назначаете значения для своих текстовых полей и меток INSIDE a для каждого цикла, поэтому они всегда представляют ваш последний элемент в коллекции 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"; 
    } 
} 
Смежные вопросы