首页 > 解决方案 > 使用 linq 从数据表中按顺序返回结果

问题描述

我正在从我的应用程序中的 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

标签: linqdatatable

解决方案


你可以尝试在下面的结果中做groupby

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];

}

推荐阅读