C# 如何使用LINQ获取最后一条记录?

C# 如何使用LINQ获取最后一条记录?,c#,winforms,linq,datagridview,C#,Winforms,Linq,Datagridview,即使有类似的问题和答案,但我无法让它工作。 我想显示最后一条记录,我指的是我表格中的最后一名员工,并在dataGridview中显示他/她 名字、姓氏等等。当我在windows窗体中重新加载此函数时,会出现此错误 “索引超出范围。必须为非负且小于集合的大小” 这是我的代码,不工作。先谢谢你 var employee = db.Employees. OrderByDescending(s =>s.EmployeeId).

即使有类似的问题和答案,但我无法让它工作。 我想显示最后一条记录,我指的是我表格中的最后一名员工,并在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;
                    }

将方法从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();
  • employee!=如果使用
    First()
    ,则null
    无效-阅读
  • 我假设,您在这一行
    dgvEmployee.Columns[0]上得到异常。Visible=false。如果调试代码,您会注意到
    dgvEmployee.Columns[0]
    为空

  • 构建一个数据表并使用此代码

    私有void Form1\u加载(对象发送方、事件参数e) { var db=新的linqDataContext()


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

    哪一行引发异常?调试该“服务”数据源。确保DGVEMPPLOYEE有列。该标题与您的问题不完全匹配。我建议您逐步检查代码,找出错误的具体引发位置,并使用
    FirstOrDefault()
    First()
    如果序列中没有元素,将抛出一个
    InvlidOperationException
    。@JohnG,很抱歉我输入了错误的文本,我刚刚从服务编辑到了员工,但仍然是相同的错误您得到了最后一条记录,但您稍后失败。这是一个太明显的问题,只需调试即可。
    dgvEmployee.Columns[0]
    -可能是您的问题,网格没有刷新行。感谢您的回复,第一个有。Take(1)givs me错误,Dbset,DbQuery..不支持,另一个givs me empty,没有数据重新计算givs me empty GridView,但是如果我使用Tolist()而不是FirstOrDefautl()然后我让所有员工感谢您的回复,但是这个FirstOrDefault()givs me empty,没有数据重新处理givs me empty GridView,但是如果我使用Tolist()而不是FirstOrDefault()的话然后我会让所有的员工欢迎你!我建议你在回答时,解释一下代码的作用,以便让OP了解其原始问题/代码的错误!继续发布精彩的答案,谢谢!
            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());
        }
    
    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();