2012-04-27 1 views
1

나는 PetaPoco를 좋아하고 코드에 기록 된 코드를 볼 때 놀라움을 금치 못합니다.PetaPoco 페이징 된 쿼리 생성 개선

SELECT em.SysEmailID, 
     [DisplayID], 
     Case When em.SysEmailCategoryID IS NULL Then em.CategoryName Else cat.CategoryName End as 'ResultCategoryName', 
     [Name], 
     IsActive, 
     em.ModifiedDateTime, 
     us.Username 
      FROM [dbo].[SysEmail] em 
       Left JOIN dbo.Users us ON em.CreatedBy = us.UserID 
        Left JOIN dbo.SysEmailCategory cat on em.SysEmailCategoryID = cat.SysEmailCategoryID 

ResultCategoryName가 Case When 문에 "비행"에 생성됩니다 실제 프로젝트를 위해 그것을 사용하는 동안 나는 이런 식으로 뭔가이었다 쿼리를 가지고있어서, 그러나, 나는이 문제에 직면했다. 이것은 매우 간단한 쿼리입니다. 이제 PetaPoco로 작성된 코드를 발견하면 문장이 마무리되고 행 번호 기능이 추가됩니다.

SELECT * FROM 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY ResultCategoryName desc) peta_rn, 
     em.SysEmailID, 
     [DisplayID], 
     Case When em.SysEmailCategoryID IS NULL Then em.CategoryName Else cat.CategoryName End as 
     'ResultCategoryName', 
     [Name], 
     IsActive, 
     em.ModifiedDateTime, 
     us.Username 
      FROM [dbo].[SysEmail] em Left JOIN dbo.Users us ON em.CreatedBy = us.UserID 
       Left JOIN dbo.SysEmailCategory cat on em.SysEmailCategoryID = cat.SysEmailCategoryID 

    ) peta_paged WHERE peta_rn>0 AND peta_rn<=10 

을 그리고 그렇게되면 당신은 SQL을 오류를 Invalid column name "ResultCategoryName"를 얻을 : 그래서 당신의 쿼리가됩니다. 나는 방법 'BuildPageQueries<T>'을 수정하고 실제 SQL이 생성 if (_dbType == DBType.SqlServer || _dbType == DBType.Oracle) 내에서, 나는 그것이 같은 것으로 수정 :

sqlPage = string.Format("SELECT * FROM (SELECT ROW_NUMBER() OVER ({0}) peta_rn, peta_query.* From (Select {1}) as peta_query) peta_paged WHERE peta_rn>@{2} AND peta_rn<[email protected]{3}", 
             sqlOrderBy == null ? "ORDER BY (SELECT NULL)" : sqlOrderBy, sqlSelectRemoved, args.Length, args.Length + 1); 

를이 쿼리 생성이 작동

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ResultCategoryName asc) peta_rn, 
    peta_query.* 
     From (
       Select em.SysEmailID, [DisplayID], 
       Case When em.SysEmailCategoryID IS NULL Then em.CategoryName Else cat.CategoryName End as 'ResultCategoryName', 
       [Name], 
       IsActive, 
       em.ModifiedDateTime, 
       us.Username 
        FROM [dbo].[SysEmail] em Left JOIN dbo.Users us ON em.CreatedBy = us.UserID 
         Left JOIN dbo.SysEmailCategory cat on em.SysEmailCategoryID = cat.SysEmailCategoryID 
          ) as peta_query) peta_paged WHERE peta_rn>0 AND peta_rn<=10 

을! :). 그러나 이것이 올바른 방법인지 아니면 더 좋은 방법인지를 알아야합니다.

답변

3

당신이해야 할 일은 SQL을 다른 select로 감싸는 것뿐입니다.

예 :

select * from (**your query here**) query order by ResultCategoryName asc 

계산 된 열이있을 때만 수행하면됩니다.

+0

오 OK. PetaPoco 소스 자체를 수정하여 매번이 작업을 수행 할 필요가 없습니다. 엑스트라 셀렉트 *를 할 때마다 매번 성능이 저하 되더라도 성능이 떨어지지는 않을 것입니다. 쿼리 분석기에서는 거의 1 %이거나 0 % 일 수 있습니다. – TCM

+0

나는 다음 메이저 버전에서 이것을 보게 될 것이다. 이 시나리오를 지원해야합니다. 건배. – Schotime

+0

감사합니다. Schotime. 내가 github 너무 그것에 대한 문제를 만들었습니다. Btw, 다음 주요 릴리스는 언제입니까? – TCM