2011-11-19 2 views
5

날짜순으로 정렬해야하지만 날짜는 데이터베이스에 텍스트로 저장됩니다. 엔티티에 Linq를 사용하여 쿼리를 수행합니다.Linq : 텍스트로 저장된 날짜순 정렬

데이터베이스가 설계된 방식으로 많은 다른 데이터 형식이 해당 열에 있기 때문에 열을 날짜 열로 변경할 수 없습니다. 특정 행이 어떤 유형인지 알 수 있도록 type이라는 하위 항목이 있습니다.

+0

날짜가 아닌 값으로 무엇을하고 싶습니까? 그들을 버려? – Otiel

+0

데이터 열이 – Luke101

+1

인 @ Luke101이 데이터베이스에서 모든 레코드를 먼저 검색 한 다음 해당 목록에 대한 작업을 수행 하는지를 알려주는 다른 열에 형식을 갖기 때문에 쿼리에서 데이터 값만 선택하게됩니다 (정렬과 같은 ...) –

답변

2

당신은 추가 할 수 있습니다 .. 그것에서 보기를 구축 할 수있는 discriminator가 특정 값을 가지고있을 때 날짜로 그 문자열을 변환 할 테이블에 계산 열 (여기서는 단지 'date'을 사용했습니다).

ALTER TABLE Foo 
ADD trueDate AS 
    CASE 
     WHEN type = 'date' THEN CONVERT(date, 'mixedColumn', 101) 
     ELSE NULL 
    END 
PERSISTED 

당신은 시간 정보를 가지고 있다면, dateCONVERT() 기능에 datetime해야한다.

또한 101은 예상되는 형식이 MM/dd/yyyy임을 나타내는 스타일 코드입니다. 다른 값이 있으면 http://msdn.microsoft.com/en-us/library/ms187928.aspx을 참조하십시오. 그러나 100보다 작은 스타일을 사용하면 표현식이 비 결정적이라고 간주되어 계산 열 PERSISTED을 만들 수 없기 때문에 전환이 즉시 수행됩니다. 각 쿼리와 함께 (당신은 그것을 원하지 않는다).

계산 된 열은 행 값이 변경되면 자체적으로 업데이트됩니다. 그렇지 않으면 값은 다른 열과 마찬가지로 유지되고 쿼리 가능합니다. 트리거가 필요하지 않습니다.

+0

와우. 좋은. 하나 더. 해당 열에 색인을 추가 할 수 있습니까? 날짜, 정수, 문자열 및 기타 데이터 유형을 저장합니다. 다른 데이터 형식으로 열을 인덱스 싶습니다. 이것이 가능한가? – Luke101

+0

@ Luke101 다른 데이터 형식을 가진 열은 인덱싱 할 수 있지만 varchar로만 인덱싱됩니다. 명확하게하기 위해, 계산 된 열은 식별자가 날짜를 나타내는 날짜와 그렇지 않은 경우에만 날짜를 포함하는 * added * 열입니다. 여기에 설명 된대로 계산 열에 인덱스를 만들 수 있습니다. http://msdn.microsoft.com/en-us/library/ms189292.aspx – Jay

0

날짜를 포함하는 모든 행이 동일한 날짜 형식을 사용하는 경우 문자열 값으로 주문할 수 있습니다. 그러나 가장 일반적인 (즉, 영어) 날짜 형식이 해와 함께 시작하지 않기 때문에 문제가 될 수 있습니다.

옵션 A : 메모리를 정렬하십시오.

var records = db.YourTable.Where(o=>o.Discriminator =="date").AsEnumerable() 
    .Select(o=>new {Entity= o, Date=DateTime.Parse(o.YourColumn)}) 
    .OrderBy(o.Date).Select(o=>o.Entity); 

당신이 행을 많이 가지고, 또는 당신이있는 경우, 적어도 주문 결과를 캐시 할 수있는 품위있는 경우 ...

옵션 B를이 작업을 수행하지 마십시오 : 데이터베이스 마법
DB에 추가 열을 추가하고 THAT 날짜 (null 입력 가능)를 만들고 discriminator가 날짜 인 경우 업데이트하십시오. 당신은 (DML) 트리거에 업데이트 할 수 있습니다 중 하나 또는 변환이 간단 경우 C# ...
또는에서 당신은

관련 문제