2012-04-30 35 views
5

Tôi có DataTable lớn Tôi muốn nhận tập hợp con của DataTable này được biểu diễn dưới dạng DataTable. Nói ngắn gọn cách tôi chọn các cột cụ thể trong DataTable.LINQ to DataTable

Tôi đã cố gắng một cái gì đó như thế này nhưng nó không hoạt động ...

DataTable dTable = new DataTable(); 
... 
... 
... 
     DataTable dt = from field in dTable 
         where field.Field<string>("Manager") 
         where field.Field<string>("Phone") 
         select field; 

Có lẽ mã của tôi là sai, làm thế nào để tôi nhận được "quản lý" và cột "Số điện thoại" từ một DataTable khác mà không cần looping nghĩ rằng nó?

+0

Bạn đang truy cập gì? SQL? Đối tượng CLR? – Tormod

+0

Không, tôi đang truy cập DataTable –

+0

Bạn có thể nói mục đích của bạn là gì để giúp bạn, bằng mã hiện tại của bạn, tôi không thể hiểu bạn muốn gì (hai lồng nhau 'where'?) –

Trả lời

4

tham khảo các DataTableExtensions -

http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

Sau đó ...

var whatever = dTable.AsEnumerable(); 

Sau đó, mỗi ví dụ MSDN ...

var productNames = from products in table.AsEnumerable() 
     select products.Field<string>("ProductName"); 

Chỉnh sửa/cập nhật: Đáng tiếc là tôi làm không nghĩ rằng có một xây dựng trong trực tiếp đúc trở lại một DataTable với một differe lược đồ nt. Bạn để sử dụng DataTable không? Tôi tin rằng ... vì nó có thể là quá nhiều nỗ lực để tái cấu trúc và kiểm tra mã của bạn. Chúc bạn may mắn và giữ cho chúng tôi được đăng khi làm việc với các danh sách được đánh máy mạnh hơn là nhiều hơn thú vị.

+0

Cảm ơn Kris! Nhưng tôi phải có DataTable nhỏ. –

+1

@WildGoat: ['CopyToDataTable'] (http://msdn.microsoft.com/en-us/library/bb396189.aspx) là những gì bạn đang tìm kiếm. Thật không may là DataTable kết quả phải có cùng một lược đồ (các trường) làm DataTable gốc. Vì vậy, trong ngắn hạn: nó không phải là có thể. Phiên bản dài cũng hoạt động với bất kỳ loại vô danh nào: http://stackoverflow.com/a/9259348/284240 –

2

Bạn có thể viết:

var query = from row in dTable.AsEnumerable() 
     select new 
     { 
     manager = row.Field<string>("Manager"), 
     phone = row.Field<string>("Phone")       
     }; 
1

Bạn có thể thực hiện LINQ truy vấn trên bảng DataTable Hoặc cụ thể về DataSet với sự giúp đỡ của AsEnumerable.

Dưới đây là ví dụ, điều này có thể hữu ích.

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 
    DataColumn dc; 
    DataRow dr; 
    ds.DataSetName = "products"; 
    dt.TableName = "product"; 

    dc = new DataColumn("product_id",long.MaxValue.GetType()); 
    dt.Columns.Add(dc); 

    dc = new DataColumn("product_name"); 
    dt.Columns.Add(dc); 

    dr = dt.NewRow(); 
    dr["product_id"] = 1; 
    dr["product_name"] = "Monitor"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 2; 
    dr["product_name"] = "Mouse"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 3; 
    dr["product_name"] = "KeyBoard"; 
    dt.Rows.Add(dr); 

    dr = dt.NewRow(); 
    dr["product_id"] = 4; 
    dr["product_name"] = "LCD"; 
    dt.Rows.Add(dr); 

    ds.Tables.Add(dt); 

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable() 
            where tbl.Field<long>(0) <= 2 
            select tbl; 

    Response.Write("<b>Query Results 1</b>"); 
    foreach (DataRow row in objResult1) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    } 

    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable() 
            let product_name = tbl.Field<string>(1) 
            where product_name.StartsWith("Key") 
            || product_name.StartsWith("Mo") 
            select tbl; 

    Response.Write("<br/><br/><b>Query Results 2</b>"); 
    foreach (DataRow row in objResult2) 
    { 
     Response.Write(string.Format("<br/>Product ID: {0} , Product Name: {1}", row.Field<long>(0), row.Field<string>(1))); 
    }