2

我有一个数据表,我正在尝试执行 datatable.Select(Name Like '#%#') 但出现无效模式错误(期望名称为 col 的表的结果为 #Mike#,#Brow#..)。对所有项目使用转义序列力也可以正常工作。许多人建议使用 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 函数失败。

4

2 回答 2

3

通常 LINQ 查询适用于实现IEnumerable<T>/ IQueryable<T> Interface. 但是 DataTable 没有实现这些。所以我们不能直接在 DataTable 上应用 LINQ 查询。

但是 DataTable 类有一个名为的扩展方法AsEnumerable,它返回IEnumerableDataRow 的集合。因此,我们可以AsEnumerable在 DataTable 上应用该函数,然后在结果集合上使用一些 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()
于 2012-09-05T21:11:00.403 回答
0

VB

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

C#

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;
 }
于 2015-07-23T09:22:02.733 回答