使用linq按顺序从数据表返回结果

时间:2019-01-02 07:59:52

标签: linq datatable

我正在从我的应用程序中获取excel表中的行,该表保存了生物特征识别机的出勤记录。为了获得最佳结果,我必须删除冗余数据。为此,我必须定期管理入住和退房时间。例如,首先办理入住手续以进入,然后办理退房午餐时间,然后再次办理退回,最后退房回家。同时,excel中的行包含多个签入和签出,这是因为员工倾向于对两者都做一次以上。

我设法从excel获取记录并添加到数据表中。现在,对于序列和排序部分,我正在努力实现所需的结果。下面是我的代码。

  protected void btnSaveAttendance_Click(object sender, EventArgs e)
    {
        try
        {
            if (FileUpload1.HasFile && Path.GetExtension(FileUpload1.FileName) == ".xls")
            {
                using (var excel = new OfficeOpenXml.ExcelPackage(FileUpload1.PostedFile.InputStream))
                {
                    var tbl = new DataTable();
                    var ws = excel.Workbook.Worksheets.First();
                    var hasHeader = true;  // adjust accordingly
                                           // add DataColumns to DataTable
                    foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
                        tbl.Columns.Add(hasHeader ? firstRowCell.Text
                            : String.Format("Column {0}", firstRowCell.Start.Column));

                    // add DataRows to DataTable
                    int startRow = hasHeader ? 2 : 1;
                    for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
                    {
                        var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                        DataRow row = tbl.NewRow();
                        foreach (var cell in wsRow)
                            row[cell.Start.Column - 1] = cell.Text;
                        tbl.Rows.Add(row);
                    }

                    var distinctNames = (from row in tbl.AsEnumerable()
                                         select row.Field<string>("Employee Code")).Distinct();

                    DataRow[] dataRows = tbl.Select().OrderBy(u => u["Employee Code"]).ToArray();

                    var ss = dataRows.Where(p => p.Field<string>("Employee Code") == "55").ToArray();


                }
            }
        }
        catch (Exception ex) { }
    }

我得到的结果是:

Employee Code   Employee Name      Date Time       In / Out
 55                   Alex         12/27/2018 8:59    IN
 55                   Alex         12/27/2018 8:59    IN
 55                   Alex         12/27/2018 13:00   OUT
 55                   Alex         12/27/2018 13:00   OUT
 55                   Alex         12/27/2018 13:48   IN
 55                   Alex         12/27/2018 13:49   IN
 55                   Alex         12/27/2018 18:08   OUT

我想先进入然后再进入,然后再进入。这将迭代四次以生成结果。

预期结果是:

Employee Code   Employee Name       Date Time      In / Out
 55                   Alex         12/27/2018 8:59    IN
 55                   Alex         12/27/2018 13:00   OUT
 55                   Alex         12/27/2018 13:48   IN
 55                   Alex         12/27/2018 18:08   OUT

1 个答案:

答案 0 :(得分:0)

您是否可以尝试在以下结果中进行分组依据

ss=ss.GroupBy(x=>x.DateTime).ToArray();

构建一个逻辑,如果您的结果具有2个连续的In / Out,如下所示。 在这里,我认为是字段名称

var tt;
for(int i=0;i<ss.Count();i++)
{
if(ss[i].In=="In" && (tt!=null || tt.LastOrDefault().In!="In"))
tt=ss[i];
else if(ss[i].In=="Out" && (tt!=null || tt.LastOrDefault().In!="Out"))
tt=ss[i];

}