2012-09-05 54 views
0

我有一個數據表,我試圖做 datatable.Select(名稱像'#%#'),但得到錯誤,無效模式(預期的結果名稱列的表#Mike#,#Brow#..)。對於所有物品使用轉義序列dint也可以很好地工作。許多人建議使用Linq--但對它來說是新的。我怎樣才能從這個數據表中做Linq的這個過濾器。Datatable.Select with VB.net

這是什麼,我試圖做一個樣品..

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#在..但選擇功能失效。

回答

3

通常,LINQ查詢適用於實現IEnumerable<T>/ IQueryable<T> Interface的數據源。但DataTable沒有實現任何這些。所以我們不能直接在DataTable上應用LINQ查詢。

但DataTable類有一個名爲AsEnumerable的擴展方法,它返回IEnumerable集合的DataRow。所以我們可以在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() 
+0

VB.NET被標記。順便說一句,在VB.NET中'AsEnumerable'沒有必要。 –

+0

@TimSchmelter:啊!讓我回到VB.NET版本。 – Shyju

+0

@Shyju熱切等待.. :) – user1066231

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; 
}