Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataTable select with LiNQ and check is there duplicate rows or not

Tags:

c#

linq

I used .Net framwork 4.0 with WinForm application component DataGridView and set DataSource with DataTable.Then there's a button to add row into DataGridView.

That code like this.

gridTable = (DataTable)dgrMainGrid.DataSource; 
DataRow dr = gridTable.NewRow();

Before adding New Row into DataTable I checked if there's a duplicate row.To do that I used this LINQ Query.

//Item Code cannot duplicate
var results = from itmCode in gridTable.AsEnumerable()
              where (itmCode.Field<string>("Item Code") == txtGrdItmLoc.Text)
              select itmCode;

There after how I check the duplicate rows available or not in the data table?

if(//doWhatever function here ){
  //if there's duplicate row values 
  isNotDuplicate = false;
}
else{
  isNotDuplicate=true;
}

Before go to following step I need to get is there a duplicate or not and set it into isNotDuplicate variable or similar thing to check that. so i think to count the results rows but there's no such function to count 'var results`, Any possibility to do that?

if (!isDuplicate)
{
     dr["#"] = true;
     dr["Item Code"] = lSysItemCode;
     dr["Stock Code"] = txtGdrItmItemLoc.Text;
     dr["Brand"] = txtGrdItmBrand.Text;
     dr["Model No"] = cmbGrdItmModel.SelectedValue.ToString();
     gridTable.Rows.Add(dr);
     dgrMainGrid.DataSource = gridTable;
}

I can use for loop with DataTable and check whether it's contain new value that equals to "Item Code" but I looking alternative method with linq.

Simply I'm looking replacement for this by using linq.

foreach (DataRow r in gridTable.Rows) {
             if (r["Item Code"].ToString() == txtGrdItmLoc.Text) {
                    isDuplicate = true;
             }
        }

Sample Project : http://1drv.ms/1K4JnHt

Sample Code : http://pastebin.com/v7NMdUrf

like image 414
Elshan Avatar asked Nov 10 '22 07:11

Elshan


1 Answers

You have not made it clear that in your DataTable if you are looking for duplicates for any specific Item Code or for any Item Code. Anyways,here is the code for both the scenarios:-

If you are looking for duplicates for any specific Item Code then you can simply check the count like this:-

bool istxtGrdItmLocDuplicate = gridTable.AsEnumerable()
                        .Count(x => x.Field<string>("ItemCode") == txtGrdItmLoc.Text) > 1;

If you are looking for duplicates in the entire DataTable, then simply group by Item Code and check the respective count for each Item Code like this:-

bool isDuplicate = gridTable.AsEnumerable()
                            .GroupBy(x => x.Field<string>("ItemCode")
                            .Any(x => x.Count() > 1);
like image 85
Rahul Singh Avatar answered Nov 14 '22 22:11

Rahul Singh