函数 Return LastOrDefault()

function Return LastOrDefault()

我有 ExpesnseIDVM ViewModel,它只包含 1 个变量 ExpenseID 来保存数据库中的最后一个值

public IEnumerable<ExpesnseIDVM> Profile(LoginVM loginVM)
{
    var data = (from a in context.Employees
                where a.Email == loginVM.Email
                join b in context.Expenses on a.EmployeeId equals b.EmployeeId
                select new ExpesnseIDVM()
                { ExpenseID = b.ExpenseId }).ToList().LastOrDefault();

    return data;
}

我对 return 类型有疑问,我应该使用哪种 return 类型来获取值

这里有四个问题:

  • SQL 如果您不指定 OrderBy
  • ,服务器不保证项目的顺序
  • SQL没有LastOrDefault直接翻译。 EF 可能会尝试反转定义的 OrderBy 并调用 FirstOrDefault - 再次 OrderBy 需要
  • LastOrDefault returns 一个实例,不可枚举
  • ToList() 将整个 table 加载到内存中,但你只需要一条记录,所以不要使用它。

考虑按以下方式重写您的查询:

public ExpesnseIDVM Profile(LoginVM loginVM)
{
    var data = (from a in context.Employees
                where a.Email == loginVM.Email
                join b in context.Expenses on a.EmployeeId equals b.EmployeeId
                orderby b.ExpenseId descending
                select new ExpesnseIDVM()
                { ExpenseID = b.ExpenseId }).FirstOrDefault();

    return data;
}

你有 IQueryable?<T> 作为 linq 查询的 return 值,然后你有 .ToList() 这使得 EF 计算查询,得到 List<T> 最后 .LastOrDefault() return 是 T 的单个对象。