Как и где использовать метод AddRange () - PullRequest
0 голосов
/ 27 января 2019

Я хочу отобразить связанные данные из второй таблицы с каждым значением в первой таблице

Я пробовал этот запрос

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

Результаты

Я хочу отобразить кратчайшее время со значением столбца «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 голосов
/ 27 января 2019

Фактическая проблема не связана с AddRange (), вам нужно условие where перед GroupBy (), чтобы ограничить посещаемость (до группировки) только записями, относящимися к этому конкретному сотруднику, например,

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

Зависит от вашей модели, для сравнения лучше использовать какой-либо идентификатор вместо 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
                                                 {
                                                     ...        
                                                 })
                       );
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...