2012-04-27 26 views
1

我是PetaPoco的忠實粉絲,當我看到寫入其中的代碼時,簡直驚訝不已。然而,儘管使用它的現實生活中的項目,我所面臨的問題,其中我有一個查詢是這樣的:在「飛」與Case When報表生成PetaPoco Paged查詢生成改進

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。這是一個相當簡單的查詢。現在,如果您發現使用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>'和內if (_dbType == DBType.SqlServer || _dbType == DBType.Oracle)在產生實際的SQL,我修改了它是這樣的:

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

所有你需要做的就是用另一個select來包裝你的sql。

例如。

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

您只有在計算出列時才需要這樣做。

+0

哦,好的。我已經修改了我的PetaPoco源碼,所以我不需要每次都這樣做。我猜即使每次使用額外的Select * from,性能也不會受到傷害。查詢分析器中可能幾乎不會有1%,甚至可能只有0%。 – TCM 2012-04-29 03:11:35

+0

我會看看下一個主要版本。有幾種情況需要支持。乾杯。 – Schotime 2012-04-29 03:19:29

+0

感謝Schotime。我也在github上爲它創建了一個問題。順便說一句,下一個主要版本是什麼時候? – TCM 2012-04-29 03:21:07