我的数据表下面有如下所示的数据,现在我必须根据列" Roles"来过滤行。其中包含的值为55:1,55:2,55:3
下面是我尝试过滤的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;
答案 0 :(得分:1)
一种方法是使用LINQ
(To-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();