如何以及在何处使用AddRange()方法

时间:2019-01-27 10:06:32

标签: linq entity-framework-core

我想显示第二个表中的相关数据,第一个表中的每个值

我已经尝试过该查询

public ActionResult Index()
    {            
        List<EmployeeAtt> empWithDate = new List<EmployeeAtt>();

        var employeelist = _context.TblEmployee.ToList();

        foreach (var employee in employeelist)
        {               
            var employeeAtt = _context.AttendanceTable
                .GroupBy(a => a.DateAndTime.Date)
                .Select(g => new EmployeeAtt
                   {
                     Date = g.Key,
                     Emp_name = employee.EmployeeName,
                     InTime = g.Any(e => e.ScanType == "I") ? g.Where(e => 
                     e.ScanType == "I").Min(e => 
                     e.DateAndTime.ToShortTimeString())
                     .ToString() : "Absent",
                     OutTime = g.Any(e => e.ScanType == "O") ? g.Where(e => 
                     e.ScanType == "O").Max(e =>
                     e.DateAndTime.ToShortTimeString())
                     .ToString() : "Absent"                                                         
                    });

            empWithDate.AddRange(employeeAtt);
        }
        return View(empWithDate);
    }  

这是我的出勤表

AttendanceTable

Results

我想用最短时间显示“ I”列值对每个员工,最后一次显示“ O”列值作为超时。我认为我没有在适当的地方使用AddRange()。那应该去哪里?

public partial class TblEmployee
{
    public TblEmployee()
    {
        AttendanceTable = new HashSet<AttendanceTable>();
    }

    public int EmpId { get; set; }
    public string EmployeeName { get; set; }

    public virtual ICollection<AttendanceTable> AttendanceTable { get; set; }
}

 public partial class AttendanceTable
{
    public int Id { get; set; }
    public int AttendanceId { get; set; }
    public int EmployeeId { get; set; }
    public string ScanType { get; set; }
    public DateTime DateAndTime { get; set; }

    public virtual TblEmployee Employee { get; set; }
}

1 个答案:

答案 0 :(得分:0)

实际问题与AddRange()不相关,您需要在GroupBy()之前使用where子句,以将出勤(在分组之前)限制为仅与该特定员工相关的记录,例如

_context.AttendanceTable
        .Where(a => a.Employee == employee.EmployeeName)
        .GroupBy(a => a.DateAndTime.Date)
        ...

根据模型的不同,最好使用某种ID代替EmployeeName进行比较。

还可以使用SelectMany()代替for循环和AddRange()将结果合并到一个列表中。像这样:

List<EmployeeAtt> empWithDate = _context.TblEmployee.ToList()
            .SelectMany(employee => 
                            _context.AttendanceTable
                                    .Where(a => a.Employee == employee.EmployeeName)
                                    .GroupBy(a => a.DateAndTime.Date)
                                    .Select(g => new EmployeeAtt
                                                 {
                                                     ...        
                                                 })
                       );
...