2014-12-17 3 views
4

나는 사용자 정보의 데이터 테이블을 가지고 있습니다. 성, 사용자 ID 또는 사용자의 역할을 사용할 수있는 검색을 수행하려고합니다. 이름과 ID에 대한 검색 텍스트 상자와 사용자의 역할에 대한 검색 드롭 다운이 있습니다. 모든 항목이 비어있을 수는 없지만 모든 조합을 사용할 수 있습니다. 나는 다음과 같은 것을 사용하고 있지만, 항상 전체 데이터 테이블을 반환하기 때문에 그것이 옳다고 생각한다 :Linq를 사용하여 데이터 세트를 검색하는 데이터 테이블

dtUsers.CaseSensitive = false; 
var results = dtUsers.AsEnumerable() 
    .Where(r => r.Field<String>("LASTNAME").Contains(tbName.Text.Trim()) 
      || r.Field<String>("USERID").Contains(tbUserID.Text.Trim()) 
      || r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text));    

dtUsers = results.CopyToDataTable(); 

내가 뭘 잘못하고 있니? 또한 이름과 ID에 부분 검색을 할 수 있어야합니다.

: 당신이 좋아뿐만 아니라 마지막 조건으로 그렇게 할 수 마찬가지로

var results = dtUsers.AsEnumerable() 
    .Where(r =>(!String.IsNullOrWhiteSpace(tbName.Text) && r.Field<String>("LASTNAME").Contains(tbName.Text.Trim()) 
      || (!String.IsNullOrWhiteSpace(tbUserID.Text) &&r.Field<String>("USERID").Contains(tbUserID.Text.Trim()) 
      || r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text)); 

:

답변

3

빈 문자열 먼저 (사용 String.IsNullOrWhiteSpace)처럼 다음이 필터를 적용을 확인하기 위해 조건을 수정

(ddlRoles.SelectedItem != null && 
!String.IsNullOrWhiteSpace(ddlRoles.SelectedItem.Text) && 
    r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text) 
+0

하빕 감사합니다. 그것은 완전한 일치를 예상 했으므로 (...) .IndexOf (...)로 변경했습니다. 부분 이름이나 ID를 검색 할 수 있습니다. 그러나, 비록 내가 dtUser.CaseSensitive = false를 sepcified 비록 그것은 정확한 대소 문자 일치를 기대합니다. "smi"라고 입력하면 사용자 "Smith"가 표시되지 않지만 "Smi"는 표시됩니다. – NoBullMan

+0

대소 문자를 구분하지 않으려면'IndexOf (tbName.Text, StringComparison.InvariantCultureIgnoreCast)> -1)'참조 : http://stackoverflow.com/questions/444798/case-insensitive-containsstring – Habib

+0

@NoBullMan, CaseSenstive' 속성은'DataTable.Select' (CaseSensitive 속성은 정렬, 검색 및 필터링의 문자열 비교에 영향을줍니다) ', LINQ – Habib

관련 문제