2010-08-11 7 views
10

어떻게 COL1 = "MyValue"람다 식을 사용하여 DataRow를 필터링하는 방법은 무엇입니까?

내가

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

그러나 작동하지 않습니다 물론

같은 것을 생각하고있는 행의 데이터 테이블의 행을 검색 할 수 있습니다!

+0

당신이 일치하는 행을 반환 하시겠습니까, 아니면 그냥 Select 방법

거기에 얼마나 많은 사람들이 있는지 계산 해봐. –

답변

23

당신이 할 LINQ to DataSets을 사용할 수 있습니다 : 행의 개수가 동일하지 않는 경우

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

: 어설 션에 대한 호출하지 않고, 당신은이 작업을 수행 할 수 있습니다

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

주 하나 (따라서 "단일"호출), 다음 예외가 throw됩니다 처리되지 않은 예외 합니다 테스트 케이스를 실패합니다. 개인적으로, 나는 의미 론적 의미가 명확하기 때문에 후자를 좋아한다. 당신은 필드 타입 안전한 액세스를 단순화하기 위해 DataRowExtensions classField method을 활용 (뿐만 아니라의 추가 혜택을 제공 할 수 있습니다, 또한

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

:

위 더 아래로 깍 할 수있는

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

작성한 코드는 검색 조건을 충족하는 행이 하나만 있는지 확인합니다. 당신이 실제로 행을 원하는 경우 는 AssertCount

1

를 사용하는 이유 람다하지 select 드롭?

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

오직 1 개의 등호 만 사용하십시오 – JWiley

2

당신은이 작업을 수행하기 위해 데이터 테이블의 Select 방법을 사용할 수 있습니다, 또는 DefaultDataView의 필터 속성에 : DBNull를 변환하는) .NET에서 대응을 null로 탁자. DefaultView 필터를 들어

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

:

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

이것은 구두꾼이 찾고자하는 것이 아니지만 도움이되는 것으로 보입니다. – twip

3

당신이 시도 할 수 있습니다 :

var b=datatable.AsEnumerable.where(p=> p.Field<string> 
("column_name")=="desire_value").CopyToDataTable() 
관련 문제