【问题标题】:C# Linq with FirstorDefaultC# Linq 与 FirstorDefault
【发布时间】:2016-12-17 02:01:57
【问题描述】:

当我选择一个日期时,我想显示在该日期进行预订的用户的姓名,但我只能看到最后一次预订的用户。我该如何解决这个问题?

这是我的代码

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

这是我的桌子

我的表格

【问题讨论】:

  • FirstOrDefault 明确要求只提供一个。删除.FirstOrDefault(),然后更新您的代码以处理多行而不是一行。
  • 当我删除 .FirstOrDefault() 时,出现错误。我不能这样使用 -> user.Name
  • 是的,这是正确的 - 我提到的“更新代码以处理多行而不是单行”的一部分。您现在有一个用户列表。编写代码以打印列表中的每个用户。例如,您可能想用逗号分隔名称:var userNames = string.Join(", ", users.Select(u => u.Name + " " + u.Surname))
  • 我像这样更新我的代码foreach (Reservation i in con.Reservations) { var user = con.Users.Where(se => se.id == i.user_id); var names = string.Join(",", user.Select(u => u.Name + " " + u.Surname)); if (i.date == date && i.hour == label4.Text ) { label4.Text = names; } else { label4.Text = "17:00 - 18:00"; }
  • 但没有任何变化?

标签: c# sql sql-server linq


【解决方案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);
}

【讨论】:

  • 这种方法有效吗?假设它有效……你明白它为什么有效吗?
【解决方案2】:

在我看来,你的逻辑是错误的,我猜。您正在为每个循环的文本框和标签 INSIDE a 分配值,这就是为什么当循环完成时它们总是代表您在 Reservations 集合中的最后一个元素。所以你需要重写你的逻辑。

【讨论】:

  • 你能举个例子吗?
【解决方案3】:

这样您将获得有关特定日期(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";
    }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多