Return results from data table in a sequence using linq












0















I'm fetching rows from excel sheet in my application that holds attendance records from the bio metric machine. In order to get the best result i have to remove the redundant data. For that I have to manage check in and checkout timings at regular intervals. For instance, First check in time for entering, and then checkout time for lunch, then again check in for returning back, and last check out for going home. Meanwhile the rows in excel contains multiple check ins and check outs as the employee tends to do more that once for both.



I have managed to get records from excel and added to data table. Now for the sequence and sorting part I'm struggling to achieve my desired result. Below is my code.



  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) { }
}


The result i'm getting is:



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


And I want to have first In and then out and then in and then out. This would iterate four times to generate the result.



Expected result is:



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









share|improve this question























  • You need to update database table restructured Parent & its child for attendence checkin / checkout.

    – Asif Raza
    Jan 2 at 11:31
















0















I'm fetching rows from excel sheet in my application that holds attendance records from the bio metric machine. In order to get the best result i have to remove the redundant data. For that I have to manage check in and checkout timings at regular intervals. For instance, First check in time for entering, and then checkout time for lunch, then again check in for returning back, and last check out for going home. Meanwhile the rows in excel contains multiple check ins and check outs as the employee tends to do more that once for both.



I have managed to get records from excel and added to data table. Now for the sequence and sorting part I'm struggling to achieve my desired result. Below is my code.



  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) { }
}


The result i'm getting is:



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


And I want to have first In and then out and then in and then out. This would iterate four times to generate the result.



Expected result is:



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









share|improve this question























  • You need to update database table restructured Parent & its child for attendence checkin / checkout.

    – Asif Raza
    Jan 2 at 11:31














0












0








0








I'm fetching rows from excel sheet in my application that holds attendance records from the bio metric machine. In order to get the best result i have to remove the redundant data. For that I have to manage check in and checkout timings at regular intervals. For instance, First check in time for entering, and then checkout time for lunch, then again check in for returning back, and last check out for going home. Meanwhile the rows in excel contains multiple check ins and check outs as the employee tends to do more that once for both.



I have managed to get records from excel and added to data table. Now for the sequence and sorting part I'm struggling to achieve my desired result. Below is my code.



  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) { }
}


The result i'm getting is:



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


And I want to have first In and then out and then in and then out. This would iterate four times to generate the result.



Expected result is:



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









share|improve this question














I'm fetching rows from excel sheet in my application that holds attendance records from the bio metric machine. In order to get the best result i have to remove the redundant data. For that I have to manage check in and checkout timings at regular intervals. For instance, First check in time for entering, and then checkout time for lunch, then again check in for returning back, and last check out for going home. Meanwhile the rows in excel contains multiple check ins and check outs as the employee tends to do more that once for both.



I have managed to get records from excel and added to data table. Now for the sequence and sorting part I'm struggling to achieve my desired result. Below is my code.



  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) { }
}


The result i'm getting is:



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


And I want to have first In and then out and then in and then out. This would iterate four times to generate the result.



Expected result is:



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






linq datatable






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 2 at 7:59









Salar MuhammadSalar Muhammad

80111




80111













  • You need to update database table restructured Parent & its child for attendence checkin / checkout.

    – Asif Raza
    Jan 2 at 11:31



















  • You need to update database table restructured Parent & its child for attendence checkin / checkout.

    – Asif Raza
    Jan 2 at 11:31

















You need to update database table restructured Parent & its child for attendence checkin / checkout.

– Asif Raza
Jan 2 at 11:31





You need to update database table restructured Parent & its child for attendence checkin / checkout.

– Asif Raza
Jan 2 at 11:31












1 Answer
1






active

oldest

votes


















0














Can you try to do groupby in the result like below



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


Build a logic, if your result have 2 successive In/Out as a sample like below.
Here In I considered as field name



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

}





share|improve this answer


























  • group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

    – Salar Muhammad
    Jan 2 at 9:09











  • Without out punch, is there any possibility in your functionality to check-in 2 times?

    – sri harsha
    Jan 2 at 9:13











  • Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

    – Salar Muhammad
    Jan 2 at 9:16











  • well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

    – Salar Muhammad
    Jan 2 at 12:05











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003020%2freturn-results-from-data-table-in-a-sequence-using-linq%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














Can you try to do groupby in the result like below



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


Build a logic, if your result have 2 successive In/Out as a sample like below.
Here In I considered as field name



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

}





share|improve this answer


























  • group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

    – Salar Muhammad
    Jan 2 at 9:09











  • Without out punch, is there any possibility in your functionality to check-in 2 times?

    – sri harsha
    Jan 2 at 9:13











  • Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

    – Salar Muhammad
    Jan 2 at 9:16











  • well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

    – Salar Muhammad
    Jan 2 at 12:05
















0














Can you try to do groupby in the result like below



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


Build a logic, if your result have 2 successive In/Out as a sample like below.
Here In I considered as field name



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

}





share|improve this answer


























  • group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

    – Salar Muhammad
    Jan 2 at 9:09











  • Without out punch, is there any possibility in your functionality to check-in 2 times?

    – sri harsha
    Jan 2 at 9:13











  • Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

    – Salar Muhammad
    Jan 2 at 9:16











  • well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

    – Salar Muhammad
    Jan 2 at 12:05














0












0








0







Can you try to do groupby in the result like below



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


Build a logic, if your result have 2 successive In/Out as a sample like below.
Here In I considered as field name



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

}





share|improve this answer















Can you try to do groupby in the result like below



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


Build a logic, if your result have 2 successive In/Out as a sample like below.
Here In I considered as field name



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

}






share|improve this answer














share|improve this answer



share|improve this answer








edited Jan 2 at 9:40

























answered Jan 2 at 9:04









sri harshasri harsha

44939




44939













  • group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

    – Salar Muhammad
    Jan 2 at 9:09











  • Without out punch, is there any possibility in your functionality to check-in 2 times?

    – sri harsha
    Jan 2 at 9:13











  • Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

    – Salar Muhammad
    Jan 2 at 9:16











  • well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

    – Salar Muhammad
    Jan 2 at 12:05



















  • group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

    – Salar Muhammad
    Jan 2 at 9:09











  • Without out punch, is there any possibility in your functionality to check-in 2 times?

    – sri harsha
    Jan 2 at 9:13











  • Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

    – Salar Muhammad
    Jan 2 at 9:16











  • well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

    – Salar Muhammad
    Jan 2 at 12:05

















group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

– Salar Muhammad
Jan 2 at 9:09





group wouldn't do it. For a reason if employee checks in twice with a difference of one minute, then this would not work.

– Salar Muhammad
Jan 2 at 9:09













Without out punch, is there any possibility in your functionality to check-in 2 times?

– sri harsha
Jan 2 at 9:13





Without out punch, is there any possibility in your functionality to check-in 2 times?

– sri harsha
Jan 2 at 9:13













Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

– Salar Muhammad
Jan 2 at 9:16





Yes, as i mentioned in my question, the employee tend to check in twice just in case if first time the record was not entered.

– Salar Muhammad
Jan 2 at 9:16













well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

– Salar Muhammad
Jan 2 at 12:05





well i have already built up the logic now. I wanted to achieve this through linq, but perhaps it is not doable at the moment. The logic is quite similar to what you have posted. Thanks for the help :)

– Salar Muhammad
Jan 2 at 12:05




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003020%2freturn-results-from-data-table-in-a-sequence-using-linq%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Monofisismo

Angular Downloading a file using contenturl with Basic Authentication

Olmecas