私は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
これで動作します!! :)。しかし、これが正しい方法なのか、それとももっと良い方法があるのかを知る必要があります。