21

hi how i can filter a datatable with linq to datatable? I have a DropDownList and there I can select the value of the Modul Column. Now I want to filter the DataTable with this Modul Column.

here is my datatable structure:

User | Host | TimeDiff | License | Telefon | Modul 

Here the Code:

protected void drp_Modules_SelectedIndexChanged(object sender, EventArgs e)
{
    string value = drp_Modules.SelectedValue;

    DataTable tb = (DataTable)Session["dt_Users"];

    tb = from item in tb //?????

    LoadUsertable(tb);
}
Habib
  • 219,104
  • 29
  • 407
  • 436
Tarasov
  • 3,625
  • 19
  • 68
  • 128

3 Answers3

50

You are better of using DataTable.Select method, but if you have to use LINQ then you can try:

DataTable selectedTable = tb.AsEnumerable()
                            .Where(r => r.Field<string>("Modul") == value)
                            .CopyToDataTable();

This would create a new DataTable based on filtered values.

If you use DataTable.Select

string expression = "Modul =" + value;
DataRow[] selectedRows = tb.Select(expression);
Habib
  • 219,104
  • 29
  • 407
  • 436
  • 1
    I know I'm a little late to the party for this one, but thanks, that helped quite a bit with something I'm working on. – user2366842 Jun 20 '14 at 19:09
  • 1
    @Habib, Just a simple comment. THANKS!!! I was breaking my head trying to cast the Rows, etc, etc, etc, when I found your answer. – Ramon Araujo Oct 15 '14 at 07:06
  • http://stackoverflow.com/questions/35507109/how-to-filter-on-multiple-columns-using-linq I have multiple columns or single column. How can I do either? Thanks. – Si8 Feb 19 '16 at 14:03
2

You can use condition to check rows exist in addition before casting. System.Linq namespace is required for Any() to work

var rows = values.AsEnumerable().Where
            (row => row.Field<string>("Status") == action);//get the rows where the status is equal to action

if(rows.Any())
{
    DataTable dt = rows.CopyToDataTable<DataRow>();//Copying the rows into the DataTable as DataRow
}
Nayas Subramanian
  • 2,269
  • 21
  • 28
1

To Retrieve the DataTable based on filtering the list of item.(i.e.,if any of the list item is present in datatable, that matched result will received.

 List<string>item=new List<string>(){"TG1","TG2"};     
 DataTable tbsplit = (from a in tbl.AsEnumerable()
              where item.Any(x => a.Field<string>("CSubset").ToUpper().Contains(x.ToUpper()))
              select a).CopyToDataTable();//By Executing this, the Filter DataTable is obtained