根据asp.net中包含特殊字符的列值过滤数据表c#

时间:2016-09-01 09:37:42

标签: c# asp.net .net linq

我的数据表下面有如下所示的数据,现在我必须根据列" Roles"来过滤行。其中包含的值为55:1,55:2,55:3

数据表如上所示 DataTable

下面是我尝试过滤的c#代码,但它不起作用

> ADODB.Connection oConn = new ADODB.Connection();
>             oConn.Open("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\";", "", "", 0);
>             string strQuery = "SELECT * FROM [" + System.IO.Path.GetFileName(strFileName) + "]";
>             ADODB.Recordset rs = new ADODB.Recordset();
>             System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter();
>             DataTable dt = new DataTable();
>             rs.Open(strQuery, "Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + ";
> Extended Properties = \"Text;HDR=YES;FMT=Delimited\";",
>                 ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1);
>             adapter.Fill(dt, rs);
>             
>             dt.Columns[0].ColumnName = "Initial";
>             dt.Columns[1].ColumnName = "BranchCode";
>             dt.Columns[2].ColumnName = "Roles";
>             
>            
>             dt.AcceptChanges();
> 
>             //DataTable tblFiltered = dt.AsEnumerable()
>             //                 .Where(r => r.Field<int>("Roles") == 1)
>             //                 .CopyToDataTable();
> 
>             dt.DefaultView.RowFilter = "Roles like '%55:%'";
> 
>             return dt;

1 个答案:

答案 0 :(得分:1)

一种方法是使用LINQTo-DataTable):

IEnumerable<DataRow> filteredRows = dt.AsEnumerable()
    .Select(row => new {row, roles = row.Field<string>("Roles").Split('/')})
    .Where(x => x.roles.Any(role => role.Split(':')[0] == "55"))
    .Select(x => x.row);

这将选择至少有一个角色以&#34; 55&#34;开头的行。

如果您想检查特定值,它更简单(也更有效):

string[] wantedRoles = {"55:1", "55:2", "55:3"};
IEnumerable<DataRow> filteredRows = dt.AsEnumerable()
    .Select(row => new {row, roles = row.Field<string>("Roles").Split('/')})
    .Where(x => x.roles.Intersect(wantedRoles).Any())
    .Select(x => x.row);

如果您想要一个只有匹配行的新DataTable

dt = filteredRows.Any() ? filteredRows.CopyToDataTable() : dt.Clone();