2012-10-19 8 views
9

다음 형식의 테이블이 있습니다.LINQ의 DateTime으로 문자열 캐스팅

PID  ID  Label  Value 
------------------------------------------ 
1  1  First Name Jenna 
1  2  DOB   10/12/1980 

내가 DOB의 J와 월부터 시작하여 성 내 코드에서 10

을 여기서 모두의 PID를 검색해야, 나는 C#에서 DataTable에 이러한를 검색 한 다음를 검색하는 LINQ를 사용하려고 내가 원하는 결과. 이것은 단지 예일뿐입니다. 이 레이블은 사용자가 정의한 모든 것일 수 있습니다.

LINQ를 사용하여 이름이 J로 시작하는 모든 PID를 검색 할 수 있지만 DOB에 대한 값을 전송하려고 할 때마다 유효하지 않은 오류가 발생합니다. Value에는 모든 유형의 정보가 포함될 수 있으므로 데이터베이스의 열 유형을 변경할 수 없습니다.

내 코드는 다음과 같습니다. 나는 LINQ에 익숙하지 않고 여전히 주위를 알아 내려고 노력하고 있습니다.

var resultQuery = from r in query.AsEnumerable() 
where (r.Field<string>("Label") == Label && 
r.Field<DateTime>("Value").Month == 10) 
select r.Field<int>("PID"); 
+0

"제나"의 날짜 시간 값이 무엇 필터링? 나는 이것이 가능하다는 것을 확신하지 못한다. – Bobson

답변

3

는하지 때문에 테이블의 값 열의 모든 항목은 유효하지 않은 변환에 실패 무엇을, DateTime로 변환합니다. 첫 번째 값이 DateTime인지 확인한 후이를 변환하고 .Month 속성을 검사하는 절을 추가 할 수 있습니다. 잠재적으로 가독성을 향상시키기 위해

DateTime d; 
var resultQuery = from r in query.AsEnumerable() 
        where (r.Field<string>("Label") == Label && 
         DateTime.TryParse(r.Field<string>("Value"), out d) && 
         d.Month == 10) 
        select r.Field<int>("PID"); 

, 당신은 또한 별도의 방법으로이를 추출 할 수 있습니다 : 당신은 매우 효율적이지 않다 메모리에 필터링을 끝낼 예정

var resultQuery = from r in query.AsEnumerable() 
        let d = TryGetDate(r.Field<string>("Value")) 
        where (r.Field<string>("Label") == Label && 
         d != null && 
         d.Month == 10) 
        select r.Field<int>("PID"); 

private DateTime? TryGetDate(string value) 
{ 
    DateTime d; 
    return DateTime.TryParse(value, out d) ? d : default(DateTime?); 
} 
+2

가독성 및 "정확성"을 위해 날짜 분석을 별도의 메서드 (DateTime? TryGetDate (문자열 값))에 넣고 구문 분석 할 수없는 경우 null을 반환하는 것이 더 낫다고 생각합니다. – ioctlLR

+0

둘 다 감사합니다 . 만약 내가 그냥 goric이 제안한 방식으로 쿼리를 실행한다면, 오류가 발생하지는 않지만, resultquery를 List로 변환하려고하면 실패합니다. 내가 .Month == 10을 꺼내 주면 내 목록이 정상적으로 작동합니다. PID = resultQuery.ToList(); PID가 목록의 유형으로 정의 된 곳 user1760153

+0

그뿐만 아니라 코드가 그대로 작동하지 않습니다. 문자열을 날짜로 파싱 할 수 있다고하더라도, 여기에있는 일을 날짜로 그냥 캐스트 할 수는 없습니다. – Servy

2

.

그래서 첫 번째 선택 데이터

var data= from r in query.AsEnumerable(); 

그런 다음 데이터

var filtered = from item in data 
       where item.Label == "Label" 
       && Convert.ToDateTime(item.DOB).Month == 10 
       select item.PID; 
관련 문제