簡體   English   中英

具有FirstorDefault的C#Linq

[英]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";
            }  
}

這是我的桌子 在此處輸入圖片說明

我的表格 在此處輸入圖片說明

我認為,您的邏輯是錯誤的。 您正在為每個循環的文本框和標簽INSIDE a分配值,這就是為什么循環結束后它們始終代表Reservations集合中的最后一個元素的原因。 因此,您需要重新編寫邏輯。

我相信您需要執行以下操作:

  • 用默認文本重置標簽
  • 查找今天的預訂
  • 循環瀏覽這些預訂並找到每個小時的對應標簽(使用預訂時間,您應該始終找到一個)
  • 查找用戶(如果有)。 如果找到,請用用戶名覆蓋標簽文本

像這樣:

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);
}

這樣,您將獲得有關特定日期預訂(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";
    }  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM