如何使用LINQ获取最新记录?

问题描述

即使对此有类似的问题和答案,但我无法使它起作用。 我想显示最后一条记录,我的意思是我表中最近的雇员,并在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;
                    }

解决方法

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,Birthday = b.BOF  
                                    
                }).FirstORDefault();

both are works
,

将方法从第一个更改为FirstORDefault。

var employee = db.Employees.
               OrderByDescending(s =>s.EmployeeId).                                  
               Select(b => new
               {
                  Id = b.EmployeeId,Birthday = b.BOF  
                                    
                }).FirstORDefault();
,
  1. employee != null如果您使用First()则毫无用处-了解How does First work
  2. 我认为,您在此行dgvEmployee.Columns[0].Visible = false;上遇到异常。如果您调试代码,则会注意到dgvEmployee.Columns[0]为空
,

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

私有无效Form1_Load(对象发送者,EventArgs e) { var db = new linqDataContext();

        var employee = db.Employees.
            OrderByDescending(s => s.EmployeeId).

            Select(b => new
            {
                Id = b.EmployeeId,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());
    }
,

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