我有一个我正在尝试做的数据表 datatable.Select(Name like'#%#')但是得到错误的无效模式(期望名称为col的表的结果为#Mike#,#Brow#..)。对所有项目使用转义序列dint工作也很好。许多人建议使用Linq - 但我是新手。我如何从这个数据表中使用Linq进行过滤。
这是我试图做的一个样本..
Dim dtSamp As Data.DataTable
dtSamp = New Data.DataTable
dtSamp.Columns.Add("Name")
dtSamp.Columns.Add("Marks")
Dim dr As DataRow
dr = dtSamp.NewRow()
dr.Item(0) = "AAA"
dr.Item(1) = "50"
dtSamp.Rows.Add(dr)
dr = dtSamp.NewRow()
dr.Item(0) = "#bbb#"
dr.Item(1) = "60"
dtSamp.Rows.Add(dr)
dr = dtSamp.NewRow()
dr.Item(0) = "ccc"
dr.Item(1) = "44"
dtSamp.Rows.Add(dr)
Dim drResult As DataRow()
drResult = dtSamp.Select("Name Like '#%#'")
Dim dtOutPutTable As Data.DataTable
dtOutPutTable = drResult.CopyToDataTable()
在dtOutPutTable中我期待1行,即#bbb#,但是Select函数失败。
答案 0 :(得分:3)
通常,LINQ查询适用于实现IEnumerable<T>/ IQueryable<T> Interface
的数据源。但DataTable没有实现任何这些。所以我们不能直接在DataTable上应用LINQ查询。
但DataTable类有一个名为AsEnumerable
的扩展方法,它返回DataRow的IEnumerable
集合。因此,我们可以在DataTable上应用AsEnumerable
函数,然后在生成的集合上使用一些LINQ。
var items=(from p in myDataTable.AsEnumerable()
select new { ID= p.Field<int>("ID").
Name=p.Field<string>("Name")
}).ToList();
var filtered=items.Where(x => x.Name.Contains("Mike"));
编辑:这是VB.NET版本(免责声明:我不是VB.NET的人。但我可以构建此代码而不会出现任何错误)
Dim items = (From p In myDataTable.AsEnumerable()
Select New With {.ID = p.Field(Of Integer)("ID"),
.Name = p.Field(Of String)("Name")}).ToList()
Dim filtered = items.Where(Function(x) x.Name.Contains("Mike")).ToList()
答案 1 :(得分:0)
Private Function likes(ByVal dt As DataTable, ByVal column As String, ByVal value As String)
Dim result = dt.Clone()
For Each row As DataRow In From row1 As DataRow In dt.Rows Where (row1(column).Contains(value))
result.ImportRow(row)
Next
Return result
End Function
private DataTable likes(ref DataTable dt, string column, string value)
{
DataTable result = dt.Clone();
foreach (DataRow row in from row1 in dt.Rowswhere (row1(column).Contains(value))) {
result.ImportRow(row);
}
return result;
}