2013-09-06 4 views
0

DataRow 배열에서 일련의 조건과 일치하는 항목을 찾으려고합니다.LINQ Contains Matchs 정확히 일치

string startDate = "1/1/2012"; 
string endDate = "11/1/2012"; 

DataRow[] scheduleResults = myDataTable.AsEnumerable() 
    .Where(r => r.Field<string>("Name").Contains("Eglin") 
    && r.Field<string>("Name").Contains(startDate) 
    && r.Field<string>("Name").Contains(endDate)).ToArray(); 

이 나에게 두 개의 데이터 행을 반환하는 scheduleResults

  1. USAF:Eglin (1/1/2012-11/1/2012)
  2. USAF:Eglin (11/1/2012-3/31/2017)

나는 startDate 실제로 내가 갖는 이유입니다 endDate에 포함되어있는 것을 볼 수 있습니다 그 두 가지 결과. 내 질문은 전체 startDate 정확히 일치하는 방법입니다, 그래서 그 두 번째 결과를 반환하지 않습니다.

+0

은 데이터 테이블의 이름, 작업 코드, 시작 날짜 및 종료 날짜를 포함 "이름"이라는 제목의 단일 열을 포함 맞습니까? –

+0

예, 유감스럽게도이 정보를 가져 오는 데이터베이스는 ID 필드와 "이름"필드로 설정되었으며 설정된 컨벤션은 시작/종료 날짜와 같은 관련 정보를 포함합니다. "이름"필드. 확실히 이상적은 아니지만이 시점에서 내가해야 할 일이있다. – DaveH

답변

2

형식이 그냥이 모든 데이터가 "이름"이라는 하나 개의 필드에 그 오타 아니라는 것을 가정한다 "(" + startDate + "-" + endDate + ")"

string startDate = "1/1/2012"; 
string endDate = "11/1/2012"; 

DataRow[] scheduleResults = myDataTable.AsEnumerable() 
    .Where(r => r.Field<string>("Name").Contains("Eglin") 
    && r.Field<string>("Name").Contains("(" + startDate + "-" + endDate + ")")) 
    .ToArray(); 

에 일치시킬 수 있습니다 동일하게 유지된다고 가정. 가능한 경우 별도의 열에 데이터 요소를 저장하는 것이 좋습니다. 이것에 대한 Regex를 사용

+0

"USAF : Elgin (2012 년 11 월 1 일부터 2012 년 1 월 1 일까지)"과 부적절하게 일치합니다. 두 번째 항목에'.Contains (String.Format ("{0} - {1}) ", startDate, endDate))' –

+0

@ 앤드류 컴스 합의 – juharr

3

문제는 데이터가 근본적으로 어색한 형식이라는 점입니다. 너 형식으로 정확히 일치하지만, 여전히 고통 스럽다.

나는 당신이 내 Noda Time 라이브러리를 사용하도록 선택하는 경우 시작/종료 값으로 DateTime (또는 LocalDate 사용하여 모든 구성 부분을 (조직, 이름, 시작, 종료?)를 포함하는 형태로 각 행을 구문 분석하는 것이 좋습니다 것입니다. ..). 이 시점에서 데이터 작업은 훨씬 간단 해집니다. 쿼리는 것 같은 뭔가 :

var query = myDataTable.AsEnumerable() 
         .Select(row => ParseRow) 
         .Where(p => p.Name.Contains("Eglin") && 
            p.StartDate == startDate && 
            p.EndDate == endDate) 
         .ToList(); 

(. ParseRow는 방법 A DataRow을 복용하고 적절한 유형을 반환 될 경우) 당신이 값을 많이 작업 위하여려고하는 경우에

, 당신은 수도 DataTable을 적절한 목록으로 변환하고 싶습니다. 데이터가 아닌 해당 행을 가져와야하는 경우 항상 소스 DataRow을 유형에 포함 할 수 있습니다.

+1

OP 데이터에 'StartDate' 및'EndDate' 필드가없는 것처럼 보입니다. 유형 문자열의'Name'입니까? –

+0

@KingKing : 질문을 다시 읽으면서, 당신이 의미하는 바를 봅니다. 삭제 및 편집. –

0

완벽 :

string name = "Eglin"; 
DataRow[] scheduleResults = 
     myDataTable.AsEnumerable() 
     .Where(r => Regex.IsMatch(r.Field<string>("Name"), 
         string.Format(".*{0}.*{1}.*{2}", name, startDate, endDate))) 
     .ToArray();