1

私は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>'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<=@{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

これで動作します!! :)。しかし、これが正しい方法なのか、それとももっと良い方法があるのか​​を知る必要があります。

4

1 に答える 1

3

あなたがしなければならないのはあなたのSQLを別のselectでラップすることです。

例えば。

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

これを行う必要があるのは、列を計算した場合のみです。

于 2012-04-28T13:20:05.580 に答える