2010-08-11 28 views
10

Làm thế nào tôi có thể tìm kiếm hàng trong một DataTable cho một hàng với col1 = "myValue"Làm cách nào để sử dụng biểu thức lambda để lọc DataRows?

Tôi đang nghĩ đến một cái gì đó giống như

Assert.IsTrue(dataSet.Tables[0].Rows. 
    FindAll(x => x.Col1 == "MyValue").Count == 1); 

Nhưng tất nhiên điều đó không làm việc!

+0

Bạn có muốn trả lại hàng phù hợp, hoặc chỉ đếm số lượng có bao nhiêu? –

Trả lời

23

Bạn có thể sử dụng LINQ to DataSets để làm điều này:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1); 

Lưu ý, bạn cũng có thể làm điều này mà không có sự kêu gọi Khẳng định:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single(); 

Nếu số lượng hàng không bằng một (do đó, các cuộc gọi đến "Single"), sau đó một ngoại lệ sẽ được ném, và rằng ngoại lệ unhandled nên không trường hợp thử nghiệm của bạn. Cá nhân, tôi thích cái sau, vì nó có ý nghĩa ngữ nghĩa rõ ràng hơn.

Trên đây có thể được tiếp tục đẽo xuống:

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue"); 

Ngoài ra, bạn có thể tận dụng lợi thế của Field method trên DataRowExtensions class để đơn giản hóa kiểu an tiếp cận với lĩnh vực này (cũng như cung cấp các lợi ích thêm chuyển đổi DBNull null đối tác trong NET):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue"); 
0

Mã bạn đã viết kiểm tra chỉ có một hàng đáp ứng điều kiện tìm kiếm của bạn. Nếu bạn thực sự muốn các hàng, hãy thả AssertCount

1

Tại sao lại sử dụng lambda chứ không phải select?

DataRow[] foundRow = (dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'"); 
+0

Chỉ nên có 1 dấu bằng – JWiley

2

Bạn có thể sử dụng phương pháp Select của bảng dữ liệu để làm điều này, hoặc các tài sản Lọc của DefaultDataView trên cai ban.

Đối với Select phương pháp:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'"); 

Đối với DefaultView Lọc:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'"; 
foreach (var drv in dataSet.Tables[0].DefaultView) 
{ 
    // Do your processing 
} 
+0

Đây có thể không phải là những gì người hỏi đang tìm kiếm, nhưng tôi thấy nó hữu ích. – twip

3

Bạn có thể thử này:

var b=datatable.AsEnumerable.where(p=> p.Field<string> 
("column_name")=="desire_value").CopyToDataTable() 
Các vấn đề liên quan