2010-03-04 5 views
2

데이터베이스에 테이블이 있습니다.이 테이블을 호출하십시오.다른 요청으로 단계별로 단일 레코드 찾기

  • MajorVersionNumber
  • MinorVersionNumber
  • RELEASEDATE

이 버전 및 만료일의 순서를 결정하는 규칙이 있습니다 이 테이블은 필드가 있습니다. C# 3에서 버전의 만료 날짜를 찾는 규칙은 영어로 읽기가 더 쉬워 보이기 때문에 알려 드리겠습니다.

 var nextMinorVersion = Versions.FirstOrDefault((version) => 
      (version.majorVersionNumber == currentVersion.majorVersionNumber) && 
      (version.minorVersionNumber == currentVersion.minorVersionNumber + 1)); 
     if (nextMinorVersion != null) return nextMinorVersion.ReleaseDate; 
     var nextMajorVersion = Versions.FirstOrDefault((version) => 
      (version.majorVersionNumber == currentVersion.majorVersionNumber + 1) && 
      (version.minorVersionNumber == 0)); 
     if (nextMajorVersion != null) return nextMajorVersion.ReleaseDate; 
     return null; 

지금이 규칙은 내가 노력하고 매우 복잡, 비효율적이고 ureadable 표현을 만들 수있는 MS SQL Server 2005 및 2008에 대한 SQL에서 구현해야합니다. C#에서 얼마나 사소한지를 생각해 보면, 나는 SQL을 잘 다루지 못하기 때문에 쉽게 할 수 없다고 생각합니다.

나는 SQL에서 C#과 비교적 비슷한 복잡성으로이를 수행 할 방법을 찾고있다.

이런 좁은 질문에 대해 사과드립니다. 일반화하는 방법을 모르겠습니다. 질문의 일반화에 대한 제안과 제목도 매우 높이 평가됩니다. 같은 - 나는 나는 그것을 생각

if exists nextMinorVersion so that 
    nextMinorVersion.majorVersionNumber = currentVersion.majorVersionNumber and 
    nextMinorVersion.minorVersionNumber = currentVersion.minorVersionNumber + 1 
    then expirationDate = nextMinorVersion.ReleaseDate 
else if exists nextMajorVersion so that 
    nextMajorVersion.majorVersionNumber = currentVersion.majorVersionNumber + 1 and 
    nextMinorVersion.majorVersionNumber = 0 
    then expirationDate = nextMajorVersion.ReleaseDate 
else expirationDate = null 
+0

일반 문장이나 의사 코드로 규칙을 설명 할 수 있습니까? 나는 LINQ와 잘 어울리지 않는다 ;-) –

+0

필자는 샘플 코드에 LINQ가 없다는 것을 깨달았지만 C# 3 확장 메서드 만 사용했다. 이것에 해당하는 질문을 수정;). –

답변

2

:

SELECT TOP 1 ReleaseDate 
FROM Versions 
WHERE 
    (MajorVersion = @CurrentMajor AND MinorVersion = @CurrentMinor + 1) 
    OR (MajorVersion = @CurrentMajor + 1 AND MinorVersion = 0) 
ORDER BY MajorVersion, MinorVersion 
C# 3과 손재주하지 않는 사람들을 위해 UPDATE 나는 의사의 규칙을 설명하려고합니다

아래의 테스트 데이터에서 모든 1.x 버전은 TOP 절과 ORDER BY가 오는 2.0 버전 (OR 절이기 때문에)을 검색합니다. 1.x 레코드 만 선택합니다 하나.

이것은 또한 버전 간 꼬인 경우 (예 : 1.3 2.0 이후에 출시되었다.)

이 참고로 여기 내 테이블 정의의 작품 :

INSERT INTO Versions VALUES (1, 0, '2009-01-01') 
INSERT INTO Versions VALUES (1, 1, '2009-01-10') 
INSERT INTO Versions VALUES (1, 2, '2009-01-21') 
INSERT INTO Versions VALUES (2, 0, '2009-02-01') 
INSERT INTO Versions VALUES (2, 1, '2009-02-20') 
INSERT INTO Versions VALUES (1, 3, '2009-03-01') 
:

CREATE TABLE [dbo].[Versions](
    [MajorVersion] [int] NOT NULL, 
    [MinorVersion] [int] NOT NULL, 
    [ReleaseDate] [datetime] NOT NULL, 
CONSTRAINT [PK_Versions] PRIMARY KEY CLUSTERED 
(
    [MajorVersion] ASC, 
    [MinorVersion] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

일부 데이터를 삽입

시험해보십시오 :

1.0 = 2009-01-10 
1.1 = 2009-01-21 
1.2 = 2009-03-01 
1.3 = 2009-02-01 
2.0 = 2009-02-20 
2.1 = NULL (no rows) 
+1

와우! TOP과 ORDER BY와 같은 외모는 내가 어떻게 해야할지 몰랐다. 지금 당장은 시간이 없으므로 코드로 테스트 한 후 투표하거나 수락 할 것입니다. –

+1

예, 1.1과 같은 버전의 경우 1.2와 2.0을 다시 얻습니다. ORDER BY는 1.2가 먼저오고 TOP 1이 첫 번째 레코드 (1.2 레코드)를 가져옵니다. 사용자 정의 SQL에서 함수를 호출하고 LINQ와 같은 두 부분으로 나눕니다. 그러나 이것이 더 효율적이라고 생각합니다. –

+0

테스트 한 결과, 원하는대로 작동했습니다. 고맙습니다! –

관련 문제