【问题标题】:How should I do to get the last record using LINQ?我应该如何使用 LINQ 获取最后一条记录?
【发布时间】:2020-10-16 15:54:27
【问题描述】:

即使有类似的问题和答案,但我无法让它发挥作用。 我想显示最后一条记录,我的意思是我表中的最后一个员工,并在 dataGridview 中显示他/她 名字、姓氏等。当我以 Windows 形式重新加载此功能时,我收到此错误

“索引超出范围。必须为非负数且小于集合的大小”

这是我的代码,但无法正常工作。提前谢谢你

var employee = db.Employees.
               OrderByDescending(s =>s.EmployeeId).
                                  
               Select(b => new
               {
                  Id = b.EmployeeId,
                  FirstName = b.FirstName,
                  LastName = b.LastName,
                  Birthday = b.BOF  
                                    
                }).First();

                    if(employee != null)
                    {
                        dgvEmployee.DataSource = employee;
                        dgvEmployee.Columns[0].Visible = false;
                    }

【问题讨论】:

  • 哪一行抛出异常?调试那个“服务”数据源。确保 dgvEmployee 有列。该标题与您的问题不完全相符。
  • 我建议您单步调试代码并找出错误的确切位置并使用FirstOrDefault()。如果序列中没有元素,First() 将抛出 InvlidOperationException
  • @JohnG ,对不起,我输入了错误的文字,我刚刚从 service 编辑到了 employee ,但仍然是同样的错误
  • 你获得了最后一条记录,但你后来失败了。这个问题太明显了,调试一下。 dgvEmployee.Columns[0] - 可能是你的问题,网格没有刷新行。

标签: c# winforms linq datagridview


【解决方案1】:

将方法从 first 更改为 FirstORDefault。

var employee = db.Employees.
               OrderByDescending(s =>s.EmployeeId).                                  
               Select(b => new
               {
                  Id = b.EmployeeId,
                  FirstName = b.FirstName,
                  LastName = b.LastName,
                  Birthday = b.BOF  
                                    
                }).FirstORDefault();

【讨论】:

  • 谢谢你的回复,但是这个 FirstOrDefault() 给我空,没有数据重新给我空 GridView,但是如果我使用 Tolist() 而不是 FirstOrDefautl() 那么我得到所有员工跨度>
【解决方案2】:
var employee = db.Employees.
               OrderByDescending(s =>s.EmployeeId).                                  
               Select(b => new
               {
                  Id = b.EmployeeId,
                  FirstName = b.FirstName,
                  LastName = b.LastName,
                  Birthday = b.BOF  
                                    
                }).take(1);
or 
var employee = db.Employees.
               OrderByDescending(s =>s.EmployeeId).                                  
               Select(b => new
               {
                  Id = b.EmployeeId,
                  FirstName = b.FirstName,
                  LastName = b.LastName,
                  Birthday = b.BOF  
                                    
                }).FirstORDefault();

both are works

【讨论】:

  • 感谢您的回复,第一个带有 .Take(1) 的错误给我 Dbset、DbQuery .. 不支持的错误,另一个给我空的,没有数据重新给我空的 GridView,但是如果我使用 Tolist() 而不是 FirstOrDefautl() 那么我会得到所有员工
【解决方案3】:
  1. employee != null 如果你使用 First() 是没用的 - 请阅读 How does First work
  2. 我假设,您在这一行遇到异常dgvEmployee.Columns[0].Visible = false;。如果你调试你的代码,你会注意到dgvEmployee.Columns[0] 是空的

【讨论】:

    【解决方案4】:

    建立一个数据表并使用此代码。

    private void Form1_Load(object sender, EventArgs e) { var db = new linqDataContext();

            var employee = db.Employees.
                OrderByDescending(s => s.EmployeeId).
    
                Select(b => new
                {
                    Id = b.EmployeeId,
                    FirstName = b.FirstName,
                    LastName = b.LastName,
                    Birthday = b.BOF
    
                });
    
            DataTable dt = new DataTable();
            dt.Columns.Add("ID");
            dt.Columns.Add("FirstName");
            dt.Columns.Add("LastName");
            dt.Columns.Add("Birthday");
            foreach (var item in employee)
            {
                var row = dt.NewRow();
                row[("ID")] = item.Id;
                row[("FirstName")] = item.FirstName;
                row[("LastName")] = item.LastName;
                row[("Birthday")] = item.Birthday;
                dt.Rows.Add(row);
            }
    
            MessageBox.Show(dt.Rows[dt.Rows.Count - 1]["ID"].ToString());
        }
    

    【讨论】:

    • 嗨 Manoochehr Sheikhzadeh,欢迎光临!我建议您在回答时稍微解释一下代码的作用,以便让 OP 了解其原始问题/代码有什么问题!继续发布很棒的答案,谢谢!
    【解决方案5】:

    where 子句后跟 OrderByDescending 和 .Take() 方法应该可以做到。

    var tempFileName = db.Employees
                                 .Where(x 
                                     => x.Id = b.EmployeeId,
                                        x.FirstName = b.FirstName,
                                        x.LastName = b.LastName,
                                        x.Birthday = b.BOF)
                                 .OrderByDescending(x => x.EmployeeId)
                                 .Take(1)
                                 .Select(x => x.FirstName)
                                 .ToList()
                                 .FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2012-10-15
      • 2012-04-11
      • 2021-12-26
      • 2015-01-29
      相关资源
      最近更新 更多