2011-05-16 3 views
1

수천 개의 행이있는 레거시 데이터베이스 (SQLServer 2008)가 있습니다. 각 레코드에는 날짜 인 logdate 필드가 있지만 21/04/2010 16:40:12 형식의 varchar로 저장됩니다.주문 방법 EF4의 Varchar 필드에 저장된 날짜

로그 날짜가 미래의 행만 반환하고 날짜순으로 정렬하면됩니다. 서버의 모든 행과 필터를 취소 할 수 있지만 잘못된 것으로 보이며 크기가 조정되지 않습니다.

가이 우리가 작동 할 수 있습니다 생각하지만 실패 무슨이다 엔티티 프레임 워크 4

에 필터링 및 주문을하는 방법입니다.

from c in db.changes 
where [DateTime]c.logdate > DateTime.Today() 
orderby [DateTime]c.logdate 
select c; 

도움을 주시면 감사하겠습니다.

답변

2

내장 된 L2E 기능을 사용하여 문자열을 DB 서버의 날짜로 구문 분석 할 수 없습니다. 당신이 할 수있는

:

  1. 이 DB를 매핑은
  2. , 쓰기 SQL 자신을 기능과 ObjectContext.ExecuteStoreQuery 그것을 실행하거나
  3. 메타 데이터를 수정.

나는 그것이 나라면 후자를 골라야한다.

+0

조금 확장 할 수 있습니까? 메타 데이터 수정 방법은 무엇입니까? 데이터베이스는 외부 응용 프로그램을위한 것이며 읽기 전용입니다. –

+0

DB를 변경할 수 없으면 메타 데이터를 수정할 수 없습니다. 즉, 색인을 생성 할 수없는 검색어로 생활해야합니다. –

+0

감사합니다. Craig, 우리는'ObjectContext.ExecuteStoreQuery' 아이디어를 조사하고 어떻게 진행되는지 살펴 보겠습니다. –

1

고유 한 LINQ 기능을 만들지 않는 한 순수한 LINQ를 통해이 작업을 수행 할 수 있는지 확신 할 수 없습니다.

CONVERT(datetime, logdate, 103) 

를 그리고 이렇게 쿼리는 다음과 같습니다 당신이 임시 쿼리를 실행하고 DataContext.Translate LINQ2SQL 방법에 수 있습니다처럼 EF4이 개체로 다시 번역 할 수 있다면, 당신은 다음과 같이 변환 할 수 있습니다 : 스키마 (난 당신이 기본적으로 날짜 시간으로 저장하기 위해 varchar 열을 수정할 수 없습니다 가정)에 추가 할 수있는 경우

SELECT 
    * 
FROM 
    changes 
WHERE 
    CONVERT(datetime, logdate, 103) > GETDATE() 
ORDER BY 
    CONVERT(datetime, logdate, 103) 

또는, 당신과 같이 계산 된 열을 추가 할 수 있습니다

ALTER TABLE 
    changes 
ADD 
    logdateDatetime AS CONVERT(datetime, logdate, 103) PERSISTED 

그런 다음 logdate 대신 logdateDatetime 열을 쿼리하십시오.

+0

일부 외부 소프트웨어 용 레거시 데이터베이스이므로 어떤 방식 으로든 스키마를 변경하면 카드에 없습니다. –

0

varchar 필드의 순서는 날짜 필드의 순서와 상당히 다를 수 있습니다. 구조를 수정하여 날짜를 올바르게 저장하거나 트리거를 통해 채워지는 추가 날짜 필드를 추가하십시오. 아마도 거기에 잘못된 날짜가있을 수도 있습니다. 왜냐하면 varchar 필드에 날짜를 넣지 않아도되는 컨트롤이 없기 때문입니다. 이러한 문제도 수정해야합니다.

+0

일부 외부 소프트웨어 용 레거시 데이터베이스이므로 스키마를 변경하는 것이 카드에 없습니다. –

+0

날짜를 날짜로 사용하여 관련 테이블을 추가 할 수 있습니까? – HLGEM

+0

데이터베이스 자체를 변경할 수 없으므로 로컬 데이터베이스에 테이블을 가지고 그 데이터를 복사하여 도덕적 인 날짜 필드로 변환 할 수 있습니다. 현재 우리는 Craig가 제안한'ObjectContext.ExecuteStoreQuery' 아이디어를 조사하고 있습니다. –

관련 문제