.net core linq select 重载索引不起作用

.net core linq select overload index does not work

在添加 Select 索引重载之前,我得到了一个 linq lambda select 代码。之前,我得到了记录列表,但我需要用于为每条记录分配唯一 ID 的索引。当我添加 ToList() 时,我得到一个没有 error/inner 异常的异常。唯一能让代码不抛出错误的方法是使用 .AsEnumberable() 但我需要一个列表。我读了很多 post 说 .ToList() 可以处理过载,但我没有成功。

这是我的代码以及我试图解决这个问题

  var emps = this.DbContext.Employees
                    .GroupJoin(this.DbContext.Depts,
                        employee => employee.EmployeeId,
                        dept => dept.EmployeeId,
                        (employee, dept) => new { employee, dept }
                    )
                    .SelectMany(
                        employee_dept_left => employee_dept_left.dept.DefaultIfEmpty(),
                        (employee_dept_left, dept) => new { employee_dept_left, dept }
                    )
                    .Join(this.DbContext.Divs,
                        emp_emp_dept => emp_emp_dept.employee_dept_left.employee.DivId,
                        division => division.DivId,
                        (emp_emp_dept, division) => new { emp_emp_dept, division }
                    )
                    .Where(s => !string.IsNullOrEmpty(filter.selectedDiv))
                    .GroupBy(grouped => new
                    {
                        grouped.emp_emp_dept.employee_dept_left.employee.EmployeeId,
                        grouped.emp_emp_dept.employee_dept_left.employee.LastNm,
                        grouped.emp_emp_dept.employee_dept_left.employee.FirstNm,
                        grouped.emp_emp_dept.employee_dept_left.employee.DivId
                    })
                    .Select((joined, index) => new EmployeeViewModel
                    {
                        Id = index,
                        EmployeeId = joined.Key.EmployeeId,
                        LastNm = joined.Key.LastNm.Trim(),
                        FirstNm = joined.Key.FirstNm.Trim(),
                        DivisionId = joined.Key.DivId,
                    }).ToList();

错误消息说

Could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

我尝试使用 .AsEnumerable() 而不是 .ToList():

List<EmployeeViewModel> test = emps.Cast<EmployeeViewModel>().ToList();

但这会引发异常。

非常感谢任何帮助。

提前致谢

Select 目前无法翻译成 SQL 的问题。您可以制作额外的 Select 来解决 AsEnumerable() 的问题。

    ...
    .Select(joined => new 
    {
        EmployeeId = joined.Key.EmployeeId,
        LastNm = joined.Key.LastNm.Trim(),
        FirstNm = joined.Key.FirstNm.Trim(),
        DivisionId = joined.Key.DivisionId,
    })
    .AsEnumerable()
    .Select((x, index) => new EmployeeViewModel
    {
        Id = index,
        EmployeeId = x.EmployeeId,
        LastNm = x.LastNm,
        FirstNm = x.FirstNm,
        DivisionId = x.DivisionId,
    }).ToList();

请注意,当存在连接时,查询在查询语法中更具可读性。

var query = 
    from employee in this.DbTracsContext.Employees
    join dept in his.DbTracsContext.Depts on employee.EmployeeId equals dept.EmployeeId into employee_dept_left
    from dept in employee_dept_left.DefaultIfEmpty()
    join division in this.DbTracsContext.Depts on employee.DivisionId equals division.DivisionId
    where string.IsNullOrEmpty(filter.DivisionSelection) || filter.DivisionSelection == "0" || employee.DivisionId == filter.DivisionSelection
    group employee by new { employee.EmployeeId, employee.LastNm, employee.FirstNm, employee.DivisionId } into g
    select new
    {
        EmployeeId = g.Key.EmployeeId,
        LastNm = g.Key.LastNm.Trim(),
        FirstNm = g.Key.FirstNm.Trim(),
        DivisionId = g.Key.DivisionId,
    };

var emps = query
    .AsEnumerable()
    .Select((x, index) => new EmployeeViewModel
    {
        Id = index,
        EmployeeId = x.EmployeeId,
        LastNm = x.LastNm,
        FirstNm = x.FirstNm,
        DivisionId = x.DivisionId,
    }).ToList();